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 01669a08f2bd05b4459e1b36ff9c84b4561d3617
parent e72d85d9afaf2f22b4e9c52c87abacc87f176ff0
Author: Remy Noulin <loader2x@gmail.com>
Date:   Tue,  1 Sep 2020 12:20:30 +0200

Accept signed index in smallBytes getAt function to allow negative indexes (like python)

completion.txt                      | 28 +++++++++++++------
documentation.md                    | 56 ++++++++++++++++++++++---------------
release/json/libsheepyCSmallBytes.h |  4 +--
release/libsheepy.h                 |  2 +-
src/json/libsheepyCSmallBytes.c     | 14 +++++++---
src/json/libsheepyCSmallBytes.h     |  4 +--
src/libsheepy.h                     |  2 +-
7 files changed, 69 insertions(+), 41 deletions(-)

Diffstat:
Mcompletion.txt | 28+++++++++++++++++++---------
Mdocumentation.md | 56++++++++++++++++++++++++++++++++++----------------------
Mrelease/json/libsheepyCSmallBytes.h | 4++--
Mrelease/libsheepy.h | 2+-
Msrc/json/libsheepyCSmallBytes.c | 14++++++++++----
Msrc/json/libsheepyCSmallBytes.h | 4++--
Msrc/libsheepy.h | 2+-
7 files changed, 69 insertions(+), 41 deletions(-)

diff --git a/completion.txt b/completion.txt @@ -38,6 +38,7 @@ stringifyExpr(expr) stringifyExpr1(expr) libsheepyErrorMask disableLibsheepyErrorLogs +shperror(string) pFuncError pStrError(str) shPrintError @@ -3420,7 +3421,8 @@ createSmallDict(obj) ;smallDictt obj; initiateSmallDict(&obj) createAllocateSmallDict(obj) ;smallDictt *obj; initiateAllocateSmallDict(&obj) cleanSmallDictP(name) smallDictt *name CLEANUP(cleanUpSmallDictTerminateG) cleanAllocateSmallDict(obj) ;cleanSmallDictP(obj); initiateAllocateSmallDict(&obj) -cleanSmallDict(name) smallDictt name CLEANUP(cleanUpSmallDictFreeG); initiateSmallDict(&name) +cleanSmallDict(name) smallDictt name CLEANUP(cleanUpSmallDictFreeLocalG); initiateSmallDict(&name) +cleanFreeSmallDict(name) smallDictt *name CLEANUP(cleanUpSmallDictFreeG) cleanFinishSmallDictP(name) smallDictt *name CLEANUP(cleanUpSmallDictFinishG) cleanDisposeSmallDict(name) smallDictt name CLEANUP(cleanUpSmallDictDisposeG); initiateSmallDict(&name) cleanSmashSmallDictP(name) smallDictt *name CLEANUP(cleanUpSmallDictSmashG) @@ -3437,7 +3439,8 @@ createSmallArray(obj) ;smallArrayt obj; initiateSmallArray(&obj) createAllocateSmallArray(obj) ;smallArrayt *obj; initiateAllocateSmallArray(&obj) cleanSmallArrayP(name) smallArrayt *name CLEANUP(cleanUpSmallArrayTerminateG) cleanAllocateSmallArray(obj) ;cleanSmallArrayP(obj); initiateAllocateSmallArray(&obj) -cleanSmallArray(name) smallArrayt name CLEANUP(cleanUpSmallArrayFreeG); initiateSmallArray(&name) +cleanSmallArray(name) smallArrayt name CLEANUP(cleanUpSmallArrayFreeLocalG); initiateSmallArray(&name) +cleanFreeSmallArray(name) smallArrayt *name CLEANUP(cleanUpSmallArrayFreeG) cleanFinishSmallArrayP(name) smallArrayt *name CLEANUP(cleanUpSmallArrayFinishG) cleanDisposeSmallArray(name) smallArrayt name CLEANUP(cleanUpSmallArrayDisposeG); initiateSmallArray(&name) cleanSmashSmallArrayP(name) smallArrayt *name CLEANUP(cleanUpSmallArraySmashG) @@ -3464,7 +3467,8 @@ createAllocateSmallJson(obj) ;smallJsont *obj; initiateAllocateSmallJson(&obj) createSJ(...) createSJF("", __VA_ARGS__, NULL) cleanSmallJsonP(name) smallJsont *name CLEANUP(cleanUpSmallJsonTerminateG) cleanAllocateSmallJson(obj) ;cleanSmallJsonP(obj); initiateAllocateSmallJson(&obj) -cleanSmallJson(name) smallJsont name CLEANUP(cleanUpSmallJsonFreeG); initiateSmallJson(&name) +cleanSmallJson(name) smallJsont name CLEANUP(cleanUpSmallJsonFreeLocalG); initiateSmallJson(&name) +cleanFreeSmallJson(name) smallJsont *name CLEANUP(cleanUpSmallJsonFreeG) cleanFinishSmallJsonP(name) smallJsont *name CLEANUP(cleanUpSmallJsonFinishG) cleanDisposeSmallJson(name) smallJsont name CLEANUP(cleanUpSmallJsonDisposeG); initiateSmallJson(&name) cleanSmashSmallJsonP(name) smallJsont *name CLEANUP(cleanUpSmallJsonSmashG) @@ -3482,7 +3486,8 @@ createSmallBytes(obj) ;smallBytest obj; initiateSmallBytes(&obj) createAllocateSmallBytes(obj) ;smallBytest *obj; initiateAllocateSmallBytes(&obj) cleanSmallBytesP(name) smallBytest *name CLEANUP(cleanUpSmallBytesTerminateG) cleanAllocateSmallBytes(obj) ;cleanSmallBytesP(obj); initiateAllocateSmallBytes(&obj) -cleanSmallBytes(name) smallBytest name CLEANUP(cleanUpSmallBytesFreeG); initiateSmallBytes(&name) +cleanSmallBytes(name) smallBytest name CLEANUP(cleanUpSmallBytesFreeLocalG); initiateSmallBytes(&name) +cleanFreeSmallBytes(name) smallBytest *name CLEANUP(cleanUpSmallBytesFreeG) cleanFinishSmallBytesP(name) smallBytest *name CLEANUP(cleanUpSmallBytesFinishG) Class SmallBool @@ -3495,7 +3500,8 @@ createSmallBool(obj) ;smallBoolt obj; initiateSmallBool(&obj) createAllocateSmallBool(obj) ;smallBoolt *obj; initiateAllocateSmallBool(&obj) cleanSmallBoolP(name) smallBoolt *name CLEANUP(cleanUpSmallBoolTerminateG) cleanAllocateSmallBool(obj) ;cleanSmallBoolP(obj); initiateAllocateSmallBool(&obj) -cleanSmallBool(name) smallBoolt name CLEANUP(cleanUpSmallBoolFreeG); initiateSmallBool(&name) +cleanSmallBool(name) smallBoolt name CLEANUP(cleanUpSmallBoolFreeLocalG); initiateSmallBool(&name) +cleanFreeSmallBool(name) smallBoolt *name CLEANUP(cleanUpSmallBoolFreeG) cleanFinishSmallBoolP(name) smallBoolt *name CLEANUP(cleanUpSmallBoolFinishG) Class SmallContainer @@ -3508,7 +3514,8 @@ createSmallContainer(obj) ;smallContainert obj; initiateSmallContainer(&obj) createAllocateSmallContainer(obj) ;smallContainert *obj; initiateAllocateSmallContainer(&obj) cleanSmallContainerP(name) smallContainert *name CLEANUP(cleanUpSmallContainerTerminateG) cleanAllocateSmallContainer(obj) ;cleanSmallContainerP(obj); initiateAllocateSmallContainer(&obj) -cleanSmallContainer(name) smallContainert name CLEANUP(cleanUpSmallContainerFreeG); initiateSmallContainer(&name) +cleanSmallContainer(name) smallContainert name CLEANUP(cleanUpSmallContainerFreeLocalG); initiateSmallContainer(&name) +cleanFreeSmallContainer(name) smallContainert *name CLEANUP(cleanUpSmallContainerFreeG) cleanFinishSmallContainerP(name) smallContainert *name CLEANUP(cleanUpSmallContainerFinishG) Class SmallDouble @@ -3521,7 +3528,8 @@ createSmallDouble(obj) ;smallDoublet obj; initiateSmallDouble(&obj) createAllocateSmallDouble(obj) ;smallDoublet *obj; initiateAllocateSmallDouble(&obj) cleanSmallDoubleP(name) smallDoublet *name CLEANUP(cleanUpSmallDoubleTerminateG) cleanAllocateSmallDouble(obj) ;cleanSmallDoubleP(obj); initiateAllocateSmallDouble(&obj) -cleanSmallDouble(name) smallDoublet name CLEANUP(cleanUpSmallDoubleFreeG); initiateSmallDouble(&name) +cleanSmallDouble(name) smallDoublet name CLEANUP(cleanUpSmallDoubleFreeLocalG); initiateSmallDouble(&name) +cleanFreeSmallDouble(name) smallDoublet *name CLEANUP(cleanUpSmallDoubleFreeG) cleanFinishSmallDoubleP(name) smallDoublet *name CLEANUP(cleanUpSmallDoubleFinishG) Class SmallInt @@ -3534,7 +3542,8 @@ createSmallInt(obj) ;smallIntt obj; initiateSmallInt(&obj) createAllocateSmallInt(obj) ;smallIntt *obj; initiateAllocateSmallInt(&obj) cleanSmallIntP(name) smallIntt *name CLEANUP(cleanUpSmallIntTerminateG) cleanAllocateSmallInt(obj) ;cleanSmallIntP(obj); initiateAllocateSmallInt(&obj) -cleanSmallInt(name) smallIntt name CLEANUP(cleanUpSmallIntFreeG); initiateSmallInt(&name) +cleanSmallInt(name) smallIntt name CLEANUP(cleanUpSmallIntFreeLocalG); initiateSmallInt(&name) +cleanFreeSmallInt(name) smallIntt *name CLEANUP(cleanUpSmallIntFreeG) cleanFinishSmallIntP(name) smallIntt *name CLEANUP(cleanUpSmallIntFinishG) Class SmallString @@ -3547,7 +3556,8 @@ createSmallString(obj) ;smallStringt obj; initiateSmallString(&obj) createAllocateSmallString(obj) ;smallStringt *obj; initiateAllocateSmallString(&obj) cleanSmallStringP(name) smallStringt *name CLEANUP(cleanUpSmallStringTerminateG) cleanAllocateSmallString(obj) ;cleanSmallStringP(obj); initiateAllocateSmallString(&obj) -cleanSmallString(name) smallStringt name CLEANUP(cleanUpSmallStringFreeG); initiateSmallString(&name) +cleanSmallString(name) smallStringt name CLEANUP(cleanUpSmallStringFreeLocalG); initiateSmallString(&name) +cleanFreeSmallString(name) smallStringt *name CLEANUP(cleanUpSmallStringFreeG) cleanFinishSmallStringP(name) smallStringt *name CLEANUP(cleanUpSmallStringFinishG) createS(...) createSF("", __VA_ARGS__, NULL) diff --git a/documentation.md b/documentation.md @@ -69,6 +69,7 @@ stringifyExpr(expr) stringifyExpr1(expr) libsheepyErrorMask disableLibsheepyErrorLogs +shperror(string) pFuncError pStrError(str) shPrintError @@ -1576,24 +1577,25 @@ extern const bool FALSE; // disableLibsheepyErrorLogs; #define libsheepyErrorMask 0x8000000000000000UL #define disableLibsheepyErrorLogs do{logMask &= (~libsheepyErrorMask);}while(0) +#define shperror(string) procbegin\ /* * print function name and system error * * to print error, use either pFuncError and shEPrintfS * or shPrintError and shEPrintfS */ -#define pFuncError do{ if ((libsheepyErrorMask) & logMask) { perror(__func__);logEBtrace;} }while(0); +#define pFuncError do{ if ((libsheepyErrorMask) & logMask) { shperror(__func__);logEBtrace;} }while(0); /* * print string and system error */ -#define pStrError(str) do{ if ((libsheepyErrorMask) & logMask) { perror(str);logEBtrace;} }while(0); +#define pStrError(str) do{ if ((libsheepyErrorMask) & logMask) { shperror(str);logEBtrace;} }while(0); /* * print error with line number, function name and file name to stderr * * to print error, use either pFuncError and shEPrintfS * or shPrintError and shEPrintfS */ -#define shPrintError do{ if ((libsheepyErrorMask) & logMask) { fprintf(stderr, "Error line "stringifyExpr(__LINE__)", function %s, file "__FILE__"\n", __func__); logEBtrace;} }while(0); +#define shPrintError do{ if ((libsheepyErrorMask) & logMask) { logE("Error line "stringifyExpr(__LINE__)", function %s, file "__FILE__"\n", __func__); logEBtrace;} }while(0); /* * print error when function failed. The error code must be -1 */ @@ -3549,10 +3551,10 @@ char **btrace(void); #if __APPLE__ // TODO readelf missing in macOS #define logBtrace -#define logBtrace char **UNIQVAR(r)=btrace();if(UNIQVAR(r)){puts("\n"BLD WHT"Backtrace:"RST);listPrintS(UNIQVAR(r));listFreeS(UNIQVAR(r));puts("---");} +#define logBtrace char **UNIQVAR(r)=btrace();if(UNIQVAR(r)){logN("\n"BLD WHT"Backtrace:"RST);forEachS(UNIQVAR(r), element){logN(element);}listFreeS(UNIQVAR(r));logN("---");} extern bool btraceCfg; /** print backtrace in error messages, default is on, use btraceEnable and btraceDisable to configure */ -#define logEBtrace if (btraceCfg) { logBtrace; } +#define logEBtrace if (btraceCfg) { char **UNIQVAR(r)=btrace();if(UNIQVAR(r)){logE("\n"BLD WHT"Backtrace:"RST);forEachS(UNIQVAR(r), element){logE(element);}listFreeS(UNIQVAR(r));logE("---");} } // ************************** // void ** lists // ************************** @@ -8236,14 +8238,14 @@ void shPrintfS(const char *fmt, ...) /* * sheepy Error printf String - * print to stderr + * print with logE * * when the formating string is NULL, "(null)" is printed * * \param * format string like printf * \return - * print to stderr + * print with logE */ void shEPrintfS(const char *fmt, ...) @@ -17492,7 +17494,8 @@ createSmallDict(obj) ;smallDictt obj; initiateSmallDict(&obj) createAllocateSmallDict(obj) ;smallDictt *obj; initiateAllocateSmallDict(&obj) cleanSmallDictP(name) smallDictt *name CLEANUP(cleanUpSmallDictTerminateG) cleanAllocateSmallDict(obj) ;cleanSmallDictP(obj); initiateAllocateSmallDict(&obj) -cleanSmallDict(name) smallDictt name CLEANUP(cleanUpSmallDictFreeG); initiateSmallDict(&name) +cleanSmallDict(name) smallDictt name CLEANUP(cleanUpSmallDictFreeLocalG); initiateSmallDict(&name) +cleanFreeSmallDict(name) smallDictt *name CLEANUP(cleanUpSmallDictFreeG) cleanFinishSmallDictP(name) smallDictt *name CLEANUP(cleanUpSmallDictFinishG) cleanDisposeSmallDict(name) smallDictt name CLEANUP(cleanUpSmallDictDisposeG); initiateSmallDict(&name) cleanSmashSmallDictP(name) smallDictt *name CLEANUP(cleanUpSmallDictSmashG) @@ -17509,7 +17512,8 @@ createSmallArray(obj) ;smallArrayt obj; initiateSmallArray(&obj) createAllocateSmallArray(obj) ;smallArrayt *obj; initiateAllocateSmallArray(&obj) cleanSmallArrayP(name) smallArrayt *name CLEANUP(cleanUpSmallArrayTerminateG) cleanAllocateSmallArray(obj) ;cleanSmallArrayP(obj); initiateAllocateSmallArray(&obj) -cleanSmallArray(name) smallArrayt name CLEANUP(cleanUpSmallArrayFreeG); initiateSmallArray(&name) +cleanSmallArray(name) smallArrayt name CLEANUP(cleanUpSmallArrayFreeLocalG); initiateSmallArray(&name) +cleanFreeSmallArray(name) smallArrayt *name CLEANUP(cleanUpSmallArrayFreeG) cleanFinishSmallArrayP(name) smallArrayt *name CLEANUP(cleanUpSmallArrayFinishG) cleanDisposeSmallArray(name) smallArrayt name CLEANUP(cleanUpSmallArrayDisposeG); initiateSmallArray(&name) cleanSmashSmallArrayP(name) smallArrayt *name CLEANUP(cleanUpSmallArraySmashG) @@ -17536,7 +17540,8 @@ createAllocateSmallJson(obj) ;smallJsont *obj; initiateAllocateSmallJson(&obj) createSJ(...) createSJF("", __VA_ARGS__, NULL) cleanSmallJsonP(name) smallJsont *name CLEANUP(cleanUpSmallJsonTerminateG) cleanAllocateSmallJson(obj) ;cleanSmallJsonP(obj); initiateAllocateSmallJson(&obj) -cleanSmallJson(name) smallJsont name CLEANUP(cleanUpSmallJsonFreeG); initiateSmallJson(&name) +cleanSmallJson(name) smallJsont name CLEANUP(cleanUpSmallJsonFreeLocalG); initiateSmallJson(&name) +cleanFreeSmallJson(name) smallJsont *name CLEANUP(cleanUpSmallJsonFreeG) cleanFinishSmallJsonP(name) smallJsont *name CLEANUP(cleanUpSmallJsonFinishG) cleanDisposeSmallJson(name) smallJsont name CLEANUP(cleanUpSmallJsonDisposeG); initiateSmallJson(&name) cleanSmashSmallJsonP(name) smallJsont *name CLEANUP(cleanUpSmallJsonSmashG) @@ -17554,7 +17559,8 @@ createSmallBytes(obj) ;smallBytest obj; initiateSmallBytes(&obj) createAllocateSmallBytes(obj) ;smallBytest *obj; initiateAllocateSmallBytes(&obj) cleanSmallBytesP(name) smallBytest *name CLEANUP(cleanUpSmallBytesTerminateG) cleanAllocateSmallBytes(obj) ;cleanSmallBytesP(obj); initiateAllocateSmallBytes(&obj) -cleanSmallBytes(name) smallBytest name CLEANUP(cleanUpSmallBytesFreeG); initiateSmallBytes(&name) +cleanSmallBytes(name) smallBytest name CLEANUP(cleanUpSmallBytesFreeLocalG); initiateSmallBytes(&name) +cleanFreeSmallBytes(name) smallBytest *name CLEANUP(cleanUpSmallBytesFreeG) cleanFinishSmallBytesP(name) smallBytest *name CLEANUP(cleanUpSmallBytesFinishG) Class SmallBool @@ -17567,7 +17573,8 @@ createSmallBool(obj) ;smallBoolt obj; initiateSmallBool(&obj) createAllocateSmallBool(obj) ;smallBoolt *obj; initiateAllocateSmallBool(&obj) cleanSmallBoolP(name) smallBoolt *name CLEANUP(cleanUpSmallBoolTerminateG) cleanAllocateSmallBool(obj) ;cleanSmallBoolP(obj); initiateAllocateSmallBool(&obj) -cleanSmallBool(name) smallBoolt name CLEANUP(cleanUpSmallBoolFreeG); initiateSmallBool(&name) +cleanSmallBool(name) smallBoolt name CLEANUP(cleanUpSmallBoolFreeLocalG); initiateSmallBool(&name) +cleanFreeSmallBool(name) smallBoolt *name CLEANUP(cleanUpSmallBoolFreeG) cleanFinishSmallBoolP(name) smallBoolt *name CLEANUP(cleanUpSmallBoolFinishG) Class SmallContainer @@ -17580,7 +17587,8 @@ createSmallContainer(obj) ;smallContainert obj; initiateSmallContainer(&obj) createAllocateSmallContainer(obj) ;smallContainert *obj; initiateAllocateSmallContainer(&obj) cleanSmallContainerP(name) smallContainert *name CLEANUP(cleanUpSmallContainerTerminateG) cleanAllocateSmallContainer(obj) ;cleanSmallContainerP(obj); initiateAllocateSmallContainer(&obj) -cleanSmallContainer(name) smallContainert name CLEANUP(cleanUpSmallContainerFreeG); initiateSmallContainer(&name) +cleanSmallContainer(name) smallContainert name CLEANUP(cleanUpSmallContainerFreeLocalG); initiateSmallContainer(&name) +cleanFreeSmallContainer(name) smallContainert *name CLEANUP(cleanUpSmallContainerFreeG) cleanFinishSmallContainerP(name) smallContainert *name CLEANUP(cleanUpSmallContainerFinishG) Class SmallDouble @@ -17593,7 +17601,8 @@ createSmallDouble(obj) ;smallDoublet obj; initiateSmallDouble(&obj) createAllocateSmallDouble(obj) ;smallDoublet *obj; initiateAllocateSmallDouble(&obj) cleanSmallDoubleP(name) smallDoublet *name CLEANUP(cleanUpSmallDoubleTerminateG) cleanAllocateSmallDouble(obj) ;cleanSmallDoubleP(obj); initiateAllocateSmallDouble(&obj) -cleanSmallDouble(name) smallDoublet name CLEANUP(cleanUpSmallDoubleFreeG); initiateSmallDouble(&name) +cleanSmallDouble(name) smallDoublet name CLEANUP(cleanUpSmallDoubleFreeLocalG); initiateSmallDouble(&name) +cleanFreeSmallDouble(name) smallDoublet *name CLEANUP(cleanUpSmallDoubleFreeG) cleanFinishSmallDoubleP(name) smallDoublet *name CLEANUP(cleanUpSmallDoubleFinishG) Class SmallInt @@ -17606,7 +17615,8 @@ createSmallInt(obj) ;smallIntt obj; initiateSmallInt(&obj) createAllocateSmallInt(obj) ;smallIntt *obj; initiateAllocateSmallInt(&obj) cleanSmallIntP(name) smallIntt *name CLEANUP(cleanUpSmallIntTerminateG) cleanAllocateSmallInt(obj) ;cleanSmallIntP(obj); initiateAllocateSmallInt(&obj) -cleanSmallInt(name) smallIntt name CLEANUP(cleanUpSmallIntFreeG); initiateSmallInt(&name) +cleanSmallInt(name) smallIntt name CLEANUP(cleanUpSmallIntFreeLocalG); initiateSmallInt(&name) +cleanFreeSmallInt(name) smallIntt *name CLEANUP(cleanUpSmallIntFreeG) cleanFinishSmallIntP(name) smallIntt *name CLEANUP(cleanUpSmallIntFinishG) Class SmallString @@ -17619,7 +17629,8 @@ createSmallString(obj) ;smallStringt obj; initiateSmallString(&obj) createAllocateSmallString(obj) ;smallStringt *obj; initiateAllocateSmallString(&obj) cleanSmallStringP(name) smallStringt *name CLEANUP(cleanUpSmallStringTerminateG) cleanAllocateSmallString(obj) ;cleanSmallStringP(obj); initiateAllocateSmallString(&obj) -cleanSmallString(name) smallStringt name CLEANUP(cleanUpSmallStringFreeG); initiateSmallString(&name) +cleanSmallString(name) smallStringt name CLEANUP(cleanUpSmallStringFreeLocalG); initiateSmallString(&name) +cleanFreeSmallString(name) smallStringt *name CLEANUP(cleanUpSmallStringFreeG) cleanFinishSmallStringP(name) smallStringt *name CLEANUP(cleanUpSmallStringFinishG) createS(...) createSF("", __VA_ARGS__, NULL) @@ -19217,9 +19228,10 @@ smallBytest* duplicate (smallBytest *self); void finish(smallBytest **self); const char* help (smallBytest *self); void* get (smallBytest *self); +smallBytest* set (smallBytest *self, void *data, uint32_t size); smallBytest* push (smallBytest *self, char data); smallBytest* pushBuffer (smallBytest *self, void *data, uint32_t size); -char getAt (smallBytest *self, uint32_t index); +char getAt (smallBytest *self, intmax_t index); size_t len (smallBytest *self); bool isEmpty(smallBytest *self); smallBytest* readFile(smallBytest *self, const char *filePath); @@ -44567,8 +44579,8 @@ baset* getSmallJsonG (smallJsont *self, baset* retType UNUSED, const char *key); * \return * char at index */ -char getAtSmallBytes (smallBytest *self, uint32_t index); -char getAtSmallBytesG(smallBytest *self, char retType UNUSED, uint32_t index); +char getAtSmallBytes (smallBytest *self, intmax_t index); +char getAtSmallBytesG(smallBytest *self, char retType UNUSED, intmax_t index); /* * get char at python index */ @@ -48211,8 +48223,8 @@ baset* getNDupSmallJsonG (smallJsont *self, baset* retType UNUSED, const char *k * \return * char at index */ -char getAtSmallBytes (smallBytest *self, uint32_t index); -char getAtSmallBytesG(smallBytest *self, char retType UNUSED, uint32_t index); +char getAtSmallBytes (smallBytest *self, intmax_t index); +char getAtSmallBytesG(smallBytest *self, char retType UNUSED, intmax_t index); /* * get char at python index */ @@ -59845,7 +59857,7 @@ smallStringt* pushNFreeManySSmallString(smallStringt *self, ...); * push data buffer to object * * \param - * bytes small bytes + * self small bytes * data buffer to push * size size of buffer */ diff --git a/release/json/libsheepyCSmallBytes.h b/release/json/libsheepyCSmallBytes.h @@ -89,7 +89,7 @@ typedef smallBytest* (*pushBufferSmallBytesFt) (smallBytest *self, void *data * \return * char at index */ -typedef char (*getAtSmallBytesFt) (smallBytest *self, uint32_t index); +typedef char (*getAtSmallBytesFt) (smallBytest *self, intmax_t index); /** * return buffer size in bytes @@ -300,7 +300,7 @@ smallBytest* duplicateSmallBytesG (smallBytest *self); void freeSmallBytesG (smallBytest *self); -char getAtSmallBytesG(smallBytest *self, char retType UNUSED, uint32_t index); +char getAtSmallBytesG(smallBytest *self, char retType UNUSED, intmax_t index); smallBytest* pushSmallBytesG (smallBytest *self, char data); size_t lenSmallBytesG(smallBytest *self); bool isEmptySmallBytesG(smallBytest *self); diff --git a/release/libsheepy.h b/release/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.3" #ifndef SH_PREFIX #define SH_PREFIX(NAME) NAME diff --git a/src/json/libsheepyCSmallBytes.c b/src/json/libsheepyCSmallBytes.c @@ -56,7 +56,7 @@ internal void* getSmallBytes(smallBytest *self); internal smallBytest* setSmallBytes(smallBytest *self, void *data, uint32_t size); internal smallBytest* pushSmallBytes(smallBytest *self, char data); internal smallBytest* pushBufferSmallBytes(smallBytest *self, void *data, uint32_t size); -internal char getAtSmallBytes(smallBytest *self, uint32_t index); +internal char getAtSmallBytes(smallBytest *self, intmax_t index); internal size_t lenSmallBytes(smallBytest *self); internal bool isEmptySmallBytes(smallBytest *self); internal smallBytest* readFileSmallBytes(smallBytest *self, const char *filePath); @@ -83,7 +83,7 @@ internal bool equalSmallBytesChar(smallBytest *self, const char *value); internal bool equalSmallBytesSmallString(smallBytest *self, smallStringt *value); internal bool equalSmallBytesBase(smallBytest *self, baset *value); smallBytest* duplicateSmallBytesG (smallBytest *self); -char getAtSmallBytesG(smallBytest *self, char retType UNUSED, uint32_t index); +char getAtSmallBytesG(smallBytest *self, char retType UNUSED, intmax_t index); smallBytest* pushSmallBytesG (smallBytest *self, char data); size_t lenSmallBytesG(smallBytest *self); bool isEmptySmallBytesG(smallBytest *self); @@ -318,7 +318,7 @@ internal smallBytest* pushBufferSmallBytes(smallBytest *self, void *data, uint32 return(self); } -internal char getAtSmallBytes(smallBytest *self, uint32_t index) { +internal char getAtSmallBytes(smallBytest *self, intmax_t index) { if (!self->B) { return(0); @@ -327,6 +327,12 @@ internal char getAtSmallBytes(smallBytest *self, uint32_t index) { if (index >= self->B->count) { return(0); } + if (index < -(intmax_t)self->B->count) { + return(0); + } + if (index < 0) { + index = (intmax_t)self->B->count + index; + } return((&(self->B->data))[index]); } @@ -815,7 +821,7 @@ smallBytest* duplicateSmallBytesG (smallBytest *self) { void freeSmallBytesG (smallBytest *self) {self->f->free(self);} -char getAtSmallBytesG(smallBytest *self, char retType UNUSED, uint32_t index) { +char getAtSmallBytesG(smallBytest *self, char retType UNUSED, intmax_t index) { return(self->f->getAt(self,index)); } diff --git a/src/json/libsheepyCSmallBytes.h b/src/json/libsheepyCSmallBytes.h @@ -89,7 +89,7 @@ typedef smallBytest* (*pushBufferSmallBytesFt) (smallBytest *self, void *data * \return * char at index */ -typedef char (*getAtSmallBytesFt) (smallBytest *self, uint32_t index); +typedef char (*getAtSmallBytesFt) (smallBytest *self, intmax_t index); /** * return buffer size in bytes @@ -300,7 +300,7 @@ smallBytest* duplicateSmallBytesG (smallBytest *self); void freeSmallBytesG (smallBytest *self); -char getAtSmallBytesG(smallBytest *self, char retType UNUSED, uint32_t index); +char getAtSmallBytesG(smallBytest *self, char retType UNUSED, intmax_t index); smallBytest* pushSmallBytesG (smallBytest *self, char data); size_t lenSmallBytesG(smallBytest *self); bool isEmptySmallBytesG(smallBytest *self); 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.2" +#define LIBSHEEPY_VERSION "1.2.3.3" #ifndef SH_PREFIX #define SH_PREFIX(NAME) NAME