diff options
| author | 2024-03-15 04:10:11 +0100 | |
|---|---|---|
| committer | 2024-03-15 04:10:11 +0100 | |
| commit | 7aa5250eb8c68472e476faf8399e98f2ba9a9c3b (patch) | |
| tree | c18ee69ac1bbf727d9295be9a62820badce8df22 /xs.h | |
| parent | Updated TODO. (diff) | |
| download | snac2-7aa5250eb8c68472e476faf8399e98f2ba9a9c3b.tar.gz snac2-7aa5250eb8c68472e476faf8399e98f2ba9a9c3b.tar.xz snac2-7aa5250eb8c68472e476faf8399e98f2ba9a9c3b.zip | |
Backport from xs.
Diffstat (limited to 'xs.h')
| -rw-r--r-- | xs.h | 99 |
1 files changed, 61 insertions, 38 deletions
| @@ -61,6 +61,7 @@ xs_val *xs_collapse(xs_val *data, int offset, int size); | |||
| 61 | xs_val *xs_insert_m(xs_val *data, int offset, const char *mem, int size); | 61 | xs_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) |
| 64 | xs_val *xs_stock(int type); | ||
| 64 | 65 | ||
| 65 | xs_str *xs_str_new(const char *str); | 66 | xs_str *xs_str_new(const char *str); |
| 66 | xs_str *xs_str_new_sz(const char *mem, int sz); | 67 | xs_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 | ||
| 140 | extern xs_val xs_stock_null[]; | ||
| 141 | extern xs_val xs_stock_true[]; | ||
| 142 | extern xs_val xs_stock_false[]; | ||
| 143 | extern xs_val xs_stock_0[]; | ||
| 144 | extern xs_val xs_stock_1[]; | ||
| 145 | extern xs_val xs_stock_list[]; | ||
| 146 | extern 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 | ||
| 153 | xs_val xs_stock_null[] = { XSTYPE_NULL }; | ||
| 154 | xs_val xs_stock_true[] = { XSTYPE_TRUE }; | ||
| 155 | xs_val xs_stock_false[] = { XSTYPE_FALSE }; | ||
| 156 | xs_val xs_stock_0[] = { XSTYPE_NUMBER, '0', '\0' }; | ||
| 157 | xs_val xs_stock_1[] = { XSTYPE_NUMBER, '1', '\0' }; | ||
| 158 | |||
| 159 | #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ | ||
| 160 | xs_val xs_stock_list[] = { XSTYPE_LIST, 0, 0, 0, 1 + _XS_TYPE_SIZE + 1, XSTYPE_EOM }; | ||
| 161 | xs_val xs_stock_dict[] = { XSTYPE_DICT, 0, 0, 0, 1 + _XS_TYPE_SIZE + 1, XSTYPE_EOM }; | ||
| 162 | #else | ||
| 163 | xs_val xs_stock_list[] = { XSTYPE_LIST, 1 + _XS_TYPE_SIZE + 1, 0, 0, 0, XSTYPE_EOM }; | ||
| 164 | xs_val xs_stock_dict[] = { XSTYPE_DICT, 1 + _XS_TYPE_SIZE + 1, 0, 0, 0, XSTYPE_EOM }; | ||
| 165 | #endif | ||
| 166 | |||
| 167 | |||
| 168 | void *_xs_realloc(void *ptr, size_t size, const char *file, int line, const char *func) | 146 | void *_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) | |||
| 369 | xs_val *xs_dup(const xs_val *data) | 347 | xs_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 | ||
| 422 | xs_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 | ||
| 442 | xs_str *xs_str_new(const char *str) | 457 | xs_str *xs_str_new(const char *str) |
| @@ -647,10 +662,14 @@ xs_str *xs_tolower_i(xs_str *str) | |||
| 647 | xs_list *xs_list_new(void) | 662 | xs_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) | |||
| 947 | xs_dict *xs_dict_new(void) | 966 | xs_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); |