summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar default2024-01-07 11:13:29 +0100
committerGravatar default2024-01-07 11:13:29 +0100
commit3d1f6049e2e91edecaf99d49624f0826d0ca945d (patch)
treefd845bbbfbe1f193bc00045b5b507b80bb47e9a9
parentMerge branch 'master' of grunfink-codeberg:grunfink/snac2 (diff)
downloadsnac2-3d1f6049e2e91edecaf99d49624f0826d0ca945d.tar.gz
snac2-3d1f6049e2e91edecaf99d49624f0826d0ca945d.tar.xz
snac2-3d1f6049e2e91edecaf99d49624f0826d0ca945d.zip
Backport from xs.
Diffstat (limited to '')
-rw-r--r--xs.h53
1 files changed, 29 insertions, 24 deletions
diff --git a/xs.h b/xs.h
index b06d148..fc475ec 100644
--- a/xs.h
+++ b/xs.h
@@ -19,9 +19,9 @@ typedef enum {
19 XSTYPE_NULL = 0x18, /* Special NULL value */ 19 XSTYPE_NULL = 0x18, /* Special NULL value */
20 XSTYPE_TRUE = 0x06, /* Boolean */ 20 XSTYPE_TRUE = 0x06, /* Boolean */
21 XSTYPE_FALSE = 0x15, /* Boolean */ 21 XSTYPE_FALSE = 0x15, /* Boolean */
22 XSTYPE_LIST = 0x1d, /* Sequence of LITEMs up to EOM (with 24bit size) */ 22 XSTYPE_LIST = 0x1d, /* Sequence of LITEMs up to EOM (with size) */
23 XSTYPE_LITEM = 0x1f, /* Element of a list (any type) */ 23 XSTYPE_LITEM = 0x1f, /* Element of a list (any type) */
24 XSTYPE_DICT = 0x1c, /* Sequence of DITEMs up to EOM (with 24bit size) */ 24 XSTYPE_DICT = 0x1c, /* Sequence of DITEMs up to EOM (with size) */
25 XSTYPE_DITEM = 0x1e, /* Element of a dict (STRING key + any type) */ 25 XSTYPE_DITEM = 0x1e, /* Element of a dict (STRING key + any type) */
26 XSTYPE_EOM = 0x19, /* End of Multiple (LIST or DICT) */ 26 XSTYPE_EOM = 0x19, /* End of Multiple (LIST or DICT) */
27 XSTYPE_DATA = 0x10 /* A block of anonymous data */ 27 XSTYPE_DATA = 0x10 /* A block of anonymous data */
@@ -36,6 +36,9 @@ typedef char xs_dict;
36typedef char xs_number; 36typedef char xs_number;
37typedef char xs_data; 37typedef char xs_data;
38 38
39/* size in bytes of the type size */
40#define _XS_TYPE_SIZE 4
41
39/* auto-destroyable strings */ 42/* auto-destroyable strings */
40#define xs __attribute__ ((__cleanup__ (_xs_destroy))) xs_val 43#define xs __attribute__ ((__cleanup__ (_xs_destroy))) xs_val
41 44
@@ -149,8 +152,8 @@ xs_val xs_stock_true[] = { XSTYPE_TRUE };
149xs_val xs_stock_false[] = { XSTYPE_FALSE }; 152xs_val xs_stock_false[] = { XSTYPE_FALSE };
150xs_val xs_stock_0[] = { XSTYPE_NUMBER, '0', '\0' }; 153xs_val xs_stock_0[] = { XSTYPE_NUMBER, '0', '\0' };
151xs_val xs_stock_1[] = { XSTYPE_NUMBER, '1', '\0' }; 154xs_val xs_stock_1[] = { XSTYPE_NUMBER, '1', '\0' };
152xs_val xs_stock_list[] = { XSTYPE_LIST, 0, 0, 5, XSTYPE_EOM }; 155xs_val xs_stock_list[] = { XSTYPE_LIST, 0, 0, 0, 1 + _XS_TYPE_SIZE + 1, XSTYPE_EOM };
153xs_val xs_stock_dict[] = { XSTYPE_DICT, 0, 0, 5, XSTYPE_EOM }; 156xs_val xs_stock_dict[] = { XSTYPE_DICT, 0, 0, 0, 1 + _XS_TYPE_SIZE + 1, XSTYPE_EOM };
154 157
155void *_xs_realloc(void *ptr, size_t size, const char *file, int line, const char *func) 158void *_xs_realloc(void *ptr, size_t size, const char *file, int line, const char *func)
156{ 159{
@@ -266,23 +269,24 @@ xstype xs_type(const xs_val *data)
266} 269}
267 270
268 271
269void _xs_put_24b(xs_val *ptr, int i) 272void _xs_put_size(xs_val *ptr, int i)
270/* writes i as a 24 bit value */ 273/* must match _XS_TYPE_SIZE */
271{ 274{
272 unsigned char *p = (unsigned char *)ptr; 275 unsigned char *p = (unsigned char *)ptr;
273 276
274 p[0] = (i >> 16) & 0xff; 277 p[0] = (i >> 24) & 0x7f;
275 p[1] = (i >> 8) & 0xff; 278 p[1] = (i >> 16) & 0xff;
276 p[2] = i & 0xff; 279 p[2] = (i >> 8) & 0xff;
280 p[3] = i & 0xff;
277} 281}
278 282
279 283
280int _xs_get_24b(const xs_val *ptr) 284int _xs_get_size(const xs_val *ptr)
281/* reads a 24 bit value */ 285/* must match _XS_TYPE_SIZE */
282{ 286{
283 unsigned char *p = (unsigned char *)ptr; 287 unsigned char *p = (unsigned char *)ptr;
284 288
285 return (p[0] << 16) | (p[1] << 8) | p[2]; 289 return (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3];
286} 290}
287 291
288 292
@@ -303,7 +307,7 @@ int xs_size(const xs_val *data)
303 case XSTYPE_LIST: 307 case XSTYPE_LIST:
304 case XSTYPE_DICT: 308 case XSTYPE_DICT:
305 case XSTYPE_DATA: 309 case XSTYPE_DATA:
306 len = _xs_get_24b(data + 1); 310 len = _xs_get_size(data + 1);
307 311
308 break; 312 break;
309 313
@@ -376,7 +380,7 @@ xs_val *xs_expand(xs_val *data, int offset, int size)
376 if (xs_type(data) == XSTYPE_LIST || 380 if (xs_type(data) == XSTYPE_LIST ||
377 xs_type(data) == XSTYPE_DICT || 381 xs_type(data) == XSTYPE_DICT ||
378 xs_type(data) == XSTYPE_DATA) 382 xs_type(data) == XSTYPE_DATA)
379 _xs_put_24b(data + 1, sz); 383 _xs_put_size(data + 1, sz);
380 384
381 return data; 385 return data;
382} 386}
@@ -401,7 +405,7 @@ xs_val *xs_collapse(xs_val *data, int offset, int size)
401 if (xs_type(data) == XSTYPE_LIST || 405 if (xs_type(data) == XSTYPE_LIST ||
402 xs_type(data) == XSTYPE_DICT || 406 xs_type(data) == XSTYPE_DICT ||
403 xs_type(data) == XSTYPE_DATA) 407 xs_type(data) == XSTYPE_DATA)
404 _xs_put_24b(data + 1, sz); 408 _xs_put_size(data + 1, sz);
405 409
406 return xs_realloc(data, _xs_blk_size(sz)); 410 return xs_realloc(data, _xs_blk_size(sz));
407} 411}
@@ -671,7 +675,7 @@ int xs_list_iter(xs_list **list, xs_val **value)
671 675
672 /* skip the start of the list */ 676 /* skip the start of the list */
673 if (xs_type(p) == XSTYPE_LIST) 677 if (xs_type(p) == XSTYPE_LIST)
674 p += 4; 678 p += 1 + _XS_TYPE_SIZE;
675 679
676 /* an element? */ 680 /* an element? */
677 if (xs_type(p) == XSTYPE_LITEM) { 681 if (xs_type(p) == XSTYPE_LITEM) {
@@ -923,7 +927,8 @@ xs_list *xs_list_cat(xs_list *l1, const xs_list *l2)
923 XS_ASSERT_TYPE(l2, XSTYPE_LIST); 927 XS_ASSERT_TYPE(l2, XSTYPE_LIST);
924 928
925 /* inserts at the end of l1 the content of l2 (skipping header and footer) */ 929 /* inserts at the end of l1 the content of l2 (skipping header and footer) */
926 return xs_insert_m(l1, xs_size(l1) - 1, l2 + 4, xs_size(l2) - 5); 930 return xs_insert_m(l1, xs_size(l1) - 1,
931 l2 + 1 + _XS_TYPE_SIZE, xs_size(l2) - (1 + _XS_TYPE_SIZE + 1));
927} 932}
928 933
929 934
@@ -986,7 +991,7 @@ int xs_dict_iter(xs_dict **dict, xs_str **key, xs_val **value)
986 991
987 /* skip the start of the list */ 992 /* skip the start of the list */
988 if (xs_type(p) == XSTYPE_DICT) 993 if (xs_type(p) == XSTYPE_DICT)
989 p += 4; 994 p += 1 + _XS_TYPE_SIZE;
990 995
991 /* an element? */ 996 /* an element? */
992 if (xs_type(p) == XSTYPE_DITEM) { 997 if (xs_type(p) == XSTYPE_DITEM) {
@@ -1145,15 +1150,15 @@ xs_data *xs_data_new(const void *data, int size)
1145{ 1150{
1146 xs_data *v; 1151 xs_data *v;
1147 1152
1148 /* add the overhead (data type + 24bit size) */ 1153 /* add the overhead (data type + size) */
1149 int total_size = size + 4; 1154 int total_size = size + 1 + _XS_TYPE_SIZE;
1150 1155
1151 v = xs_realloc(NULL, _xs_blk_size(total_size)); 1156 v = xs_realloc(NULL, _xs_blk_size(total_size));
1152 v[0] = XSTYPE_DATA; 1157 v[0] = XSTYPE_DATA;
1153 1158
1154 _xs_put_24b(v + 1, total_size); 1159 _xs_put_size(v + 1, total_size);
1155 1160
1156 memcpy(&v[4], data, size); 1161 memcpy(&v[1 + _XS_TYPE_SIZE], data, size);
1157 1162
1158 return v; 1163 return v;
1159} 1164}
@@ -1162,14 +1167,14 @@ xs_data *xs_data_new(const void *data, int size)
1162int xs_data_size(const xs_data *value) 1167int xs_data_size(const xs_data *value)
1163/* returns the size of the data stored inside value */ 1168/* returns the size of the data stored inside value */
1164{ 1169{
1165 return _xs_get_24b(value + 1) - 4; 1170 return _xs_get_size(value + 1) - (1 + _XS_TYPE_SIZE);
1166} 1171}
1167 1172
1168 1173
1169void xs_data_get(void *data, const xs_data *value) 1174void xs_data_get(void *data, const xs_data *value)
1170/* copies the raw data stored inside value into data */ 1175/* copies the raw data stored inside value into data */
1171{ 1176{
1172 memcpy(data, &value[4], xs_data_size(value)); 1177 memcpy(data, &value[1 + _XS_TYPE_SIZE], xs_data_size(value));
1173} 1178}
1174 1179
1175 1180