summaryrefslogtreecommitdiff
path: root/xs.h
diff options
context:
space:
mode:
authorGravatar default2024-03-15 04:10:11 +0100
committerGravatar default2024-03-15 04:10:11 +0100
commit7aa5250eb8c68472e476faf8399e98f2ba9a9c3b (patch)
treec18ee69ac1bbf727d9295be9a62820badce8df22 /xs.h
parentUpdated TODO. (diff)
downloadsnac2-7aa5250eb8c68472e476faf8399e98f2ba9a9c3b.tar.gz
snac2-7aa5250eb8c68472e476faf8399e98f2ba9a9c3b.tar.xz
snac2-7aa5250eb8c68472e476faf8399e98f2ba9a9c3b.zip
Backport from xs.
Diffstat (limited to 'xs.h')
-rw-r--r--xs.h99
1 files changed, 61 insertions, 38 deletions
diff --git a/xs.h b/xs.h
index 85464db..d2de44a 100644
--- a/xs.h
+++ b/xs.h
@@ -61,6 +61,7 @@ xs_val *xs_collapse(xs_val *data, int offset, int size);
61xs_val *xs_insert_m(xs_val *data, int offset, const char *mem, int size); 61xs_val *xs_insert_m(xs_val *data, int offset, const char *mem, int size);
62#define xs_insert(data, offset, data2) xs_insert_m(data, offset, data2, xs_size(data2)) 62#define xs_insert(data, offset, data2) xs_insert_m(data, offset, data2, xs_size(data2))
63#define xs_append_m(data, mem, size) xs_insert_m(data, xs_size(data) - 1, mem, size) 63#define xs_append_m(data, mem, size) xs_insert_m(data, xs_size(data) - 1, mem, size)
64xs_val *xs_stock(int type);
64 65
65xs_str *xs_str_new(const char *str); 66xs_str *xs_str_new(const char *str);
66xs_str *xs_str_new_sz(const char *mem, int sz); 67xs_str *xs_str_new_sz(const char *mem, int sz);
@@ -137,34 +138,11 @@ unsigned int xs_hash_func(const char *data, int size);
137#define XS_ASSERT_TYPE_NULL(v, t) (void)(0) 138#define XS_ASSERT_TYPE_NULL(v, t) (void)(0)
138#endif 139#endif
139 140
140extern xs_val xs_stock_null[];
141extern xs_val xs_stock_true[];
142extern xs_val xs_stock_false[];
143extern xs_val xs_stock_0[];
144extern xs_val xs_stock_1[];
145extern xs_val xs_stock_list[];
146extern xs_val xs_stock_dict[];
147
148#define xs_return(v) xs_val *__r = v; v = NULL; return __r 141#define xs_return(v) xs_val *__r = v; v = NULL; return __r
149 142
150 143
151#ifdef XS_IMPLEMENTATION 144#ifdef XS_IMPLEMENTATION
152 145
153xs_val xs_stock_null[] = { XSTYPE_NULL };
154xs_val xs_stock_true[] = { XSTYPE_TRUE };
155xs_val xs_stock_false[] = { XSTYPE_FALSE };
156xs_val xs_stock_0[] = { XSTYPE_NUMBER, '0', '\0' };
157xs_val xs_stock_1[] = { XSTYPE_NUMBER, '1', '\0' };
158
159#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
160xs_val xs_stock_list[] = { XSTYPE_LIST, 0, 0, 0, 1 + _XS_TYPE_SIZE + 1, XSTYPE_EOM };
161xs_val xs_stock_dict[] = { XSTYPE_DICT, 0, 0, 0, 1 + _XS_TYPE_SIZE + 1, XSTYPE_EOM };
162#else
163xs_val xs_stock_list[] = { XSTYPE_LIST, 1 + _XS_TYPE_SIZE + 1, 0, 0, 0, XSTYPE_EOM };
164xs_val xs_stock_dict[] = { XSTYPE_DICT, 1 + _XS_TYPE_SIZE + 1, 0, 0, 0, XSTYPE_EOM };
165#endif
166
167
168void *_xs_realloc(void *ptr, size_t size, const char *file, int line, const char *func) 146void *_xs_realloc(void *ptr, size_t size, const char *file, int line, const char *func)
169{ 147{
170 xs_val *ndata = realloc(ptr, size); 148 xs_val *ndata = realloc(ptr, size);
@@ -369,10 +347,14 @@ int xs_cmp(const xs_val *v1, const xs_val *v2)
369xs_val *xs_dup(const xs_val *data) 347xs_val *xs_dup(const xs_val *data)
370/* creates a duplicate of data */ 348/* creates a duplicate of data */
371{ 349{
372 int sz = xs_size(data); 350 xs_val *s = NULL;
373 xs_val *s = xs_realloc(NULL, _xs_blk_size(sz)); 351
352 if (data) {
353 int sz = xs_size(data);
354 s = xs_realloc(NULL, _xs_blk_size(sz));
374 355
375 memcpy(s, data, sz); 356 memcpy(s, data, sz);
357 }
376 358
377 return s; 359 return s;
378} 360}
@@ -437,6 +419,39 @@ xs_val *xs_insert_m(xs_val *data, int offset, const char *mem, int size)
437} 419}
438 420
439 421
422xs_val *xs_stock(int type)
423/* returns stock values */
424{
425 static xs_val stock_null[] = { XSTYPE_NULL };
426 static xs_val stock_true[] = { XSTYPE_TRUE };
427 static xs_val stock_false[] = { XSTYPE_FALSE };
428 static xs_val stock_0[] = { XSTYPE_NUMBER, '0', '\0' };
429 static xs_val stock_1[] = { XSTYPE_NUMBER, '1', '\0' };
430 static xs_list *stock_list = NULL;
431 static xs_dict *stock_dict = NULL;
432
433 switch (type) {
434 case 0: return stock_0;
435 case 1: return stock_1;
436 case XSTYPE_NULL: return stock_null;
437 case XSTYPE_TRUE: return stock_true;
438 case XSTYPE_FALSE: return stock_false;
439
440 case XSTYPE_LIST:
441 if (stock_list == NULL)
442 stock_list = xs_list_new();
443 return stock_list;
444
445 case XSTYPE_DICT:
446 if (stock_dict == NULL)
447 stock_dict = xs_dict_new();
448 return stock_dict;
449 }
450
451 return NULL;
452}
453
454
440/** strings **/ 455/** strings **/
441 456
442xs_str *xs_str_new(const char *str) 457xs_str *xs_str_new(const char *str)
@@ -647,10 +662,14 @@ xs_str *xs_tolower_i(xs_str *str)
647xs_list *xs_list_new(void) 662xs_list *xs_list_new(void)
648/* creates a new list */ 663/* creates a new list */
649{ 664{
650 return memcpy( 665 int sz = 1 + _XS_TYPE_SIZE + 1;
651 xs_realloc(NULL, _xs_blk_size(sizeof(xs_stock_list))), 666 xs_list *l = xs_realloc(NULL, sz);
652 xs_stock_list, sizeof(xs_stock_list) 667 memset(l, '\0', sz);
653 ); 668
669 l[0] = XSTYPE_LIST;
670 _xs_put_size(&l[1], sz);
671
672 return l;
654} 673}
655 674
656 675
@@ -660,8 +679,8 @@ xs_list *_xs_list_write_litem(xs_list *list, int offset, const char *mem, int ds
660 XS_ASSERT_TYPE(list, XSTYPE_LIST); 679 XS_ASSERT_TYPE(list, XSTYPE_LIST);
661 680
662 if (mem == NULL) { 681 if (mem == NULL) {
663 mem = xs_stock_null; 682 mem = xs_stock(XSTYPE_NULL);
664 dsz = sizeof(xs_stock_null); 683 dsz = xs_size(mem);
665 } 684 }
666 685
667 list = xs_expand(list, offset, dsz + 1); 686 list = xs_expand(list, offset, dsz + 1);
@@ -947,10 +966,14 @@ xs_list *xs_list_cat(xs_list *l1, const xs_list *l2)
947xs_dict *xs_dict_new(void) 966xs_dict *xs_dict_new(void)
948/* creates a new dict */ 967/* creates a new dict */
949{ 968{
950 return memcpy( 969 int sz = 1 + _XS_TYPE_SIZE + 1;
951 xs_realloc(NULL, _xs_blk_size(sizeof(xs_stock_dict))), 970 xs_dict *d = xs_realloc(NULL, sz);
952 xs_stock_dict, sizeof(xs_stock_dict) 971 memset(d, '\0', sz);
953 ); 972
973 d[0] = XSTYPE_DICT;
974 _xs_put_size(&d[1], sz);
975
976 return d;
954} 977}
955 978
956 979
@@ -962,8 +985,8 @@ xs_dict *_xs_dict_write_ditem(xs_dict *dict, int offset, const xs_str *key,
962 XS_ASSERT_TYPE(key, XSTYPE_STRING); 985 XS_ASSERT_TYPE(key, XSTYPE_STRING);
963 986
964 if (data == NULL) { 987 if (data == NULL) {
965 data = xs_stock_null; 988 data = xs_stock(XSTYPE_NULL);
966 dsz = sizeof(xs_stock_null); 989 dsz = xs_size(data);
967 } 990 }
968 991
969 int ksz = xs_size(key); 992 int ksz = xs_size(key);