diff options
Diffstat (limited to 'xs.h')
| -rw-r--r-- | xs.h | 53 |
1 files changed, 29 insertions, 24 deletions
| @@ -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; | |||
| 36 | typedef char xs_number; | 36 | typedef char xs_number; |
| 37 | typedef char xs_data; | 37 | typedef 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 }; | |||
| 149 | xs_val xs_stock_false[] = { XSTYPE_FALSE }; | 152 | xs_val xs_stock_false[] = { XSTYPE_FALSE }; |
| 150 | xs_val xs_stock_0[] = { XSTYPE_NUMBER, '0', '\0' }; | 153 | xs_val xs_stock_0[] = { XSTYPE_NUMBER, '0', '\0' }; |
| 151 | xs_val xs_stock_1[] = { XSTYPE_NUMBER, '1', '\0' }; | 154 | xs_val xs_stock_1[] = { XSTYPE_NUMBER, '1', '\0' }; |
| 152 | xs_val xs_stock_list[] = { XSTYPE_LIST, 0, 0, 5, XSTYPE_EOM }; | 155 | xs_val xs_stock_list[] = { XSTYPE_LIST, 0, 0, 0, 1 + _XS_TYPE_SIZE + 1, XSTYPE_EOM }; |
| 153 | xs_val xs_stock_dict[] = { XSTYPE_DICT, 0, 0, 5, XSTYPE_EOM }; | 156 | xs_val xs_stock_dict[] = { XSTYPE_DICT, 0, 0, 0, 1 + _XS_TYPE_SIZE + 1, XSTYPE_EOM }; |
| 154 | 157 | ||
| 155 | void *_xs_realloc(void *ptr, size_t size, const char *file, int line, const char *func) | 158 | void *_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 | ||
| 269 | void _xs_put_24b(xs_val *ptr, int i) | 272 | void _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 | ||
| 280 | int _xs_get_24b(const xs_val *ptr) | 284 | int _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) | |||
| 1162 | int xs_data_size(const xs_data *value) | 1167 | int 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 | ||
| 1169 | void xs_data_get(void *data, const xs_data *value) | 1174 | void 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 | ||