libsheepy
libsheepySmall.h
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 #pragma once
23 
24 #include <stdbool.h>
25 #include <stdint.h>
26 #include "libsheepy.h"
27 
39 typedef enum {
41 } smallTypet;
42 
46 static const char *SMALL_TYPE_NAMES[] UNUSED = {
47  "not a sheepy object",
48  "undefined",
49  "bool",
50  "container",
51  "dict",
52  "element",
53  "double",
54  "int",
55  "string",
56  "faststring",
57  "array",
58  "bytes"
59 };
60 
67 typedef struct {
68  char type;
69 } smallt;
70 
74 typedef struct {
75  char type;
76  bool value;
77 } sBoolt;
78 
82 typedef void (*freeSContainerFt)(void *data);
83 typedef struct {
84  char type;
85  char dataType;
86  // data is an array of size size
87  void *data;
89 } sContainert;
90 
91 // libsheepy dataTypes in sContainert (SH for libsheepy, DT for dataType)
93 
97 typedef struct {
98  char *key;
100 } sDictElemt;
101 
109 typedef struct {
110  char type;
111  uint32_t count;
112  uint32_t maxCount;
113  // data is an array of sDictElemt
115 } sDictt;
116 
120 typedef struct {
121  char type;
122  double value;
123 } sDoublet;
124 
128 typedef struct {
129  char type;
130  int64_t value;
131 } sIntt;
132 
136 typedef struct {
137  char type;
138  // data is the start of the string
139  char data;
140 } sStringt;
141 
142 // TODO
143 typedef struct {
144  char type;
145  uint32_t count;
146  uint32_t maxCount;
147  // data is the start of the string
148  char data;
149 } sFastStringt;
150 
158 typedef struct {
159  char type;
160  uint32_t count;
161  uint32_t maxCount;
162  // data is an array of pointers
164 } sArrayt;
165 
169 typedef struct {
170  char type;
171 } sUndefinedt;
172 
181 typedef struct {
182  char type;
183  uint32_t count;
184  // data is a byte array
185  char data;
186 } sBytest;
187 
193 #define isSType(obj, sType) (((smallt *) (obj))->type == sType)
194 bool isSTypeF(smallt *obj, char sType);
195 
200 #define getSType(obj) obj ? ((smallt *) (obj))->type : -1
201 
208 #define getSTypeS(obj) obj ? SMALL_TYPE_NAMES[(unsigned char)((smallt *) (obj))->type] : NULL
209 
210 size_t sSizeTiny(smallt *obj);
211 
216 sIntt* allocSInt(int64_t value) MUST_CHECK;
221 
222 void sFree(smallt *obj);
223 void sFreeTiny(smallt *obj);
224 void sDictFreeTiny(sDictt *dict);
226 
231 
243 
245 char* sEscape(smallt *obj) MUST_CHECK;
249 
252 const char** sDictTypeStrings(sDictt* obj) MUST_CHECK;
255 const char** sArrayTypeStrings(sArrayt* obj) MUST_CHECK;
258 
259 // forEach - loop macro on elements
260 #define forEachSDict(dict, element) \
261  sDictElemt *element = &((dict)->elements); \
262  for (size_t UNIQVAR(libsheepyInternalIndex) = 0; UNIQVAR(libsheepyInternalIndex) < (dict)->count ; UNIQVAR(libsheepyInternalIndex)++, element = UNIQVAR(libsheepyInternalIndex) < (dict)->count ? &((dict)->elements) + UNIQVAR(libsheepyInternalIndex) : NULL)
263 
264 #define enumerateSDict(dict, element, index) \
265  sDictElemt *element = &((dict)->elements); \
266  for (size_t index = 0; index < (dict)->count ; index++, index < (dict)->count ? element = &((dict)->elements) + index : NULL)
267 
268 #define forEachSArray(array, element) \
269  smallt *element = ((smallt **) &((array)->data))[0]; \
270  for (size_t UNIQVAR(libsheepyInternalIndex) = 0; UNIQVAR(libsheepyInternalIndex) < (array)->count ; UNIQVAR(libsheepyInternalIndex)++, element = UNIQVAR(libsheepyInternalIndex) < (array)->count ? ((smallt **) &((array)->data))[UNIQVAR(libsheepyInternalIndex)] : NULL)
271 
272 #define enumerateSArray(array, element, index) \
273  smallt *element = ((smallt **) &((array)->data))[0]; \
274  for (size_t index = 0; index < (array)->count ; index++, element = index < (array)->count ? ((smallt **) &((array)->data))[index] : NULL)
275 
276 // TODO forEachSBytes
277 
278 smallt* sDictGet(sDictt *dict, const char *key) MUST_CHECK;
279 smallt** sDictGetP(sDictt *dict, const char *key) MUST_CHECK;
280 smallt* sDictGetTiny(sDictt *dict, const char *key) MUST_CHECK;
282 void sDictSetP(sDictt **dict, const char *key, smallt *data);
283 void sDictSetTiny(sDictt **dict, const char *key, smallt *data);
284 void sDictPushTiny(sDictt **dict, const char *key, smallt *data);
285 void sDictDelTiny(sDictt *dict, const char *key);
286 
287 char* sStringGetTiny(sStringt *string) MUST_CHECK;
288 void sStringSetTiny(sStringt **string, const char *news);
289 
294 smallt** sArrayGetP(sArrayt *array, uint32_t index) MUST_CHECK;
295 smallt* sArrayGetTiny(sArrayt *array, uint32_t index) MUST_CHECK;
296 void sArraySetShortTiny(sArrayt *array, uint32_t index, smallt *value);
297 void sArraySetP(sArrayt *array, uint32_t index, smallt *value);
298 void sArraySetTiny(sArrayt *array, uint32_t index, smallt *value);
300 void sArrayDelTiny(sArrayt *array, uint32_t index);
301 void sArrayDelRangeTiny(sArrayt *array, uint32_t start, uint32_t end);
302 
303 // get void* from sBytes
304 void* sBytesGet(sBytest *bytes) MUST_CHECK;
305 void* sBytesGetTiny(sBytest *bytes) MUST_CHECK;
306 void sBytesPush(sBytest **bytes, char data);
307 // function to copy data from void* to sBytes
308 void sBytesPushBuffer(sBytest **bytes, void* data, uint32_t size);
309 void sBytesPushBufferTiny(sBytest **bytes, void* data, uint32_t size);
310 
311 // serialyzer/deserialyzer
314 void sDictSerialElementsTiny(sBytest **r, sDictt *dict);
318 void sDictDeserialElementsTiny(sDictt **dict, char **data);
char * sStringToStringTiny(sStringt *obj) MUST_CHECK
stringify string
#define MUST_CHECK
Definition: libsheepy.h:8206
char * sStringEscapeTiny(sStringt *obj) MUST_CHECK
stringify string
void sArrayFreeTiny(sArrayt *array)
free array elements and array object
dictionary element: key, value
uint32_t count
obj f free & obj
uint32_t count
sBoolt * allocSBool(bool value) MUST_CHECK
allocate a small bool
smallt * sArrayDequeueTiny(sArrayt *array) MUST_CHECK
dequeue object from array
undefined
smallt * sDuplicate(smallt *o) MUST_CHECK
duplicate small object
char * sEscapeTiny(smallt *obj) MUST_CHECK
stringify a small object
char * sToString(smallt *obj) MUST_CHECK
stringify object
freeSContainerFt free
void sStringSetTiny(sStringt **string, const char *news)
set string in small string
sStringt * allocSStringTiny(const char *data) MUST_CHECK
allocate a small string
const char ** sArrayTypeStrings(sArrayt *obj) MUST_CHECK
list first level of array types in a list of strings
smallt * sDuplicateTiny(smallt *obj) MUST_CHECK
duplicate small object
void sArrayPrependTiny(sArrayt **array, smallt *data)
prepend data in array
void sArraySetShortTiny(sArrayt *array, uint32_t index, smallt *value)
set value at index
array
sArrayt * allocSArray(void) MUST_CHECK
allocate a small array
char * sBytesToStringTiny(sBytest *obj) MUST_CHECK
stringify small bytes
base class for the small objects all small objects have a type
const char ** sDictTypeStrings(sDictt *obj) MUST_CHECK
list first level of dictionary types in a list of strings
char * sIntToStringTiny(sIntt *obj) MUST_CHECK
stringify int
sBytest * allocSBytes(void) MUST_CHECK
allocate a small bytes object
char data[7]
Definition: libsheepy.c:19690
void sDictDeserialElementsTiny(sDictt **dict, char **data)
deserialize dictionary from data
char * sToStringTiny(smallt *obj) MUST_CHECK
stringify a small object
small bytes
void(* freeSContainerFt)(void *data)
small container holding a pointer to a buffer
void sArraySerialElementsTiny(sBytest **r, sArrayt *array)
serialize array
void * sBytesGetTiny(sBytest *bytes) MUST_CHECK
get buffer in small bytes
smallt ** sArrayGetP(sArrayt *array, uint32_t index) MUST_CHECK
get pointer to object at index
uint32_t maxCount
small int
sDictElemt elements
char * array[]
sDoublet * allocSDouble(double value) MUST_CHECK
allocate a small double
smallt * sDictElemGet(sDictElemt *dictElement) MUST_CHECK
sBytest * sTypesToBytesTiny(smallt *obj) MUST_CHECK
collect the types in an array or dictionary
char * sStringGetTiny(sStringt *string) MUST_CHECK
get string in a small string object
void sFreeTiny(smallt *obj)
free any type of small object
void sDictPushTiny(sDictt **dict, const char *key, smallt *data)
push new key-value
sBytest * sSerialTiny(smallt *obj) MUST_CHECK
serialize object to small bytes
char * sArrayToStringTiny(sArrayt *obj) MUST_CHECK
stringify array
int sArrayReverseTiny(sArrayt *array) MUST_CHECK
reverse element order
smallt * sDictGetTiny(sDictt *dict, const char *key) MUST_CHECK
get object stored at key
char * sDictToStringTiny(sDictt *obj) MUST_CHECK
stringify dictionary
smallt * sDeserialTiny(sBytest *obj) MUST_CHECK
deserialize small bytes object
char type
smallt * sDictGet(sDictt *dict, const char *key) MUST_CHECK
get object stored at key
uint32_t count
void sDictSerialElementsTiny(sBytest **r, sDictt *dict)
serialize dictionary
sArrayt * sArrayDuplicateTiny(sArrayt *obj) MUST_CHECK
duplicate array
sContainert * allocSContainer(void *data) MUST_CHECK
allocate a small container The container holds a pointer to a user buffer
void sDictSetP(sDictt **dict, const char *key, smallt *data)
dictionary set pointer
char * sEscape(smallt *obj) MUST_CHECK
stringify object
sBytest * sDictTypesTiny(sDictt *obj) MUST_CHECK
list first level of object types in dictionary
char type
void sBytesPushBuffer(sBytest **bytes, void *data, uint32_t size)
push data buffer to bytes
void sDictFreeTiny(sDictt *dict)
free dictionary elements and dictionary object
void sArraySetP(sArrayt *array, uint32_t index, smallt *value)
set value at index
sBytest * sDictTypes(sDictt *obj) MUST_CHECK
list first level of object types in dictionary
sBytest * sArrayTypesTiny(sArrayt *obj) MUST_CHECK
list first level of object types in array
sBytest * sSerial(smallt *obj) MUST_CHECK
serialize object to small bytes
size_t sSizeTiny(smallt *obj)
unused function and wrong result TODO update or remove
This file has basic file, random, string, list functions.
void sArraySetTiny(sArrayt *array, uint32_t index, smallt *value)
set value at index
void * sBytesGet(sBytest *bytes) MUST_CHECK
get buffer in small bytes
void sArrayDeserialElementsTiny(sArrayt **array, char **data)
deserialize array from data
smallt * data
smallDictt * o
int64_t value
char * sDictEscapeTiny(sDictt *obj) MUST_CHECK
stringify dictionary
smallt * sArrayGetTiny(sArrayt *array, uint32_t index) MUST_CHECK
get object at index
char * sUndefinedToStringTiny(sUndefinedt *obj) MUST_CHECK
void sDictDelTiny(sDictt *dict, const char *key)
delete dictionary element
smallt * sDeserial(sBytest *obj) MUST_CHECK
deserialize small bytes object
char * sTypesTiny(smallt *obj) MUST_CHECK
get list of object types string
uint32_t maxCount
void sDictSetTiny(sDictt **dict, const char *key, smallt *data)
dictionary set key, value
uint32_t count
char * sBoolToStringTiny(sBoolt *obj) MUST_CHECK
stringify bool
in value value
sUndefinedt * allocSUndefined(void) MUST_CHECK
allocate a small undefined object
smallTypet
values defining the small object types given as parameter to the isSType function ...
bool isSTypeF(smallt *obj, char sType)
is Small Type true if obj has type sType
dictionary
double value
small string
void sFree(smallt *obj)
free non null objects
small bool
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
sDictt * allocSDict(void) MUST_CHECK
allocate a small dict
uint32_t maxCount
#define UNUSED
Definition: libsheepy.h:8195
sIntt * allocSInt(int64_t value) MUST_CHECK
allocate a small int
smallt ** sDictGetP(sDictt *dict, const char *key) MUST_CHECK
get pointer to object at key
char * sContainerToStringTiny(sContainert *obj) MUST_CHECK
bool r
small double
sDictt * sDictDuplicateTiny(sDictt *dict) MUST_CHECK
duplicate dictionary
char type
smallt * sArrayPopTiny(sArrayt *array) MUST_CHECK
pop object from array
bool value
void sArrayPushTiny(sArrayt **array, smallt *data)
push data to array
void sBytesPush(sBytest **bytes, char data)
push char to bytes
char * sDoubleToStringTiny(sDoublet *obj) MUST_CHECK
stringify double
void sBytesPushBufferTiny(sBytest **bytes, void *data, uint32_t size)
push data buffer to bytes
smallt * data
char * sArrayEscapeTiny(sArrayt *obj) MUST_CHECK
stringify array
sBytest * sArrayTypes(sArrayt *obj) MUST_CHECK
list first level of object types in array