commit 3d1f604
default
·
2024-01-07 10:13:29 +0000 UTC
parent f5f4979
Backport from xs.
1 files changed,
+29,
-24
M
xs.h
M
xs.h
+29,
-24
1@@ -19,9 +19,9 @@ typedef enum {
2 XSTYPE_NULL = 0x18, /* Special NULL value */
3 XSTYPE_TRUE = 0x06, /* Boolean */
4 XSTYPE_FALSE = 0x15, /* Boolean */
5- XSTYPE_LIST = 0x1d, /* Sequence of LITEMs up to EOM (with 24bit size) */
6+ XSTYPE_LIST = 0x1d, /* Sequence of LITEMs up to EOM (with size) */
7 XSTYPE_LITEM = 0x1f, /* Element of a list (any type) */
8- XSTYPE_DICT = 0x1c, /* Sequence of DITEMs up to EOM (with 24bit size) */
9+ XSTYPE_DICT = 0x1c, /* Sequence of DITEMs up to EOM (with size) */
10 XSTYPE_DITEM = 0x1e, /* Element of a dict (STRING key + any type) */
11 XSTYPE_EOM = 0x19, /* End of Multiple (LIST or DICT) */
12 XSTYPE_DATA = 0x10 /* A block of anonymous data */
13@@ -36,6 +36,9 @@ typedef char xs_dict;
14 typedef char xs_number;
15 typedef char xs_data;
16
17+/* size in bytes of the type size */
18+#define _XS_TYPE_SIZE 4
19+
20 /* auto-destroyable strings */
21 #define xs __attribute__ ((__cleanup__ (_xs_destroy))) xs_val
22
23@@ -149,8 +152,8 @@ xs_val xs_stock_true[] = { XSTYPE_TRUE };
24 xs_val xs_stock_false[] = { XSTYPE_FALSE };
25 xs_val xs_stock_0[] = { XSTYPE_NUMBER, '0', '\0' };
26 xs_val xs_stock_1[] = { XSTYPE_NUMBER, '1', '\0' };
27-xs_val xs_stock_list[] = { XSTYPE_LIST, 0, 0, 5, XSTYPE_EOM };
28-xs_val xs_stock_dict[] = { XSTYPE_DICT, 0, 0, 5, XSTYPE_EOM };
29+xs_val xs_stock_list[] = { XSTYPE_LIST, 0, 0, 0, 1 + _XS_TYPE_SIZE + 1, XSTYPE_EOM };
30+xs_val xs_stock_dict[] = { XSTYPE_DICT, 0, 0, 0, 1 + _XS_TYPE_SIZE + 1, XSTYPE_EOM };
31
32 void *_xs_realloc(void *ptr, size_t size, const char *file, int line, const char *func)
33 {
34@@ -266,23 +269,24 @@ xstype xs_type(const xs_val *data)
35 }
36
37
38-void _xs_put_24b(xs_val *ptr, int i)
39-/* writes i as a 24 bit value */
40+void _xs_put_size(xs_val *ptr, int i)
41+/* must match _XS_TYPE_SIZE */
42 {
43 unsigned char *p = (unsigned char *)ptr;
44
45- p[0] = (i >> 16) & 0xff;
46- p[1] = (i >> 8) & 0xff;
47- p[2] = i & 0xff;
48+ p[0] = (i >> 24) & 0x7f;
49+ p[1] = (i >> 16) & 0xff;
50+ p[2] = (i >> 8) & 0xff;
51+ p[3] = i & 0xff;
52 }
53
54
55-int _xs_get_24b(const xs_val *ptr)
56-/* reads a 24 bit value */
57+int _xs_get_size(const xs_val *ptr)
58+/* must match _XS_TYPE_SIZE */
59 {
60 unsigned char *p = (unsigned char *)ptr;
61
62- return (p[0] << 16) | (p[1] << 8) | p[2];
63+ return (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3];
64 }
65
66
67@@ -303,7 +307,7 @@ int xs_size(const xs_val *data)
68 case XSTYPE_LIST:
69 case XSTYPE_DICT:
70 case XSTYPE_DATA:
71- len = _xs_get_24b(data + 1);
72+ len = _xs_get_size(data + 1);
73
74 break;
75
76@@ -376,7 +380,7 @@ xs_val *xs_expand(xs_val *data, int offset, int size)
77 if (xs_type(data) == XSTYPE_LIST ||
78 xs_type(data) == XSTYPE_DICT ||
79 xs_type(data) == XSTYPE_DATA)
80- _xs_put_24b(data + 1, sz);
81+ _xs_put_size(data + 1, sz);
82
83 return data;
84 }
85@@ -401,7 +405,7 @@ xs_val *xs_collapse(xs_val *data, int offset, int size)
86 if (xs_type(data) == XSTYPE_LIST ||
87 xs_type(data) == XSTYPE_DICT ||
88 xs_type(data) == XSTYPE_DATA)
89- _xs_put_24b(data + 1, sz);
90+ _xs_put_size(data + 1, sz);
91
92 return xs_realloc(data, _xs_blk_size(sz));
93 }
94@@ -671,7 +675,7 @@ int xs_list_iter(xs_list **list, xs_val **value)
95
96 /* skip the start of the list */
97 if (xs_type(p) == XSTYPE_LIST)
98- p += 4;
99+ p += 1 + _XS_TYPE_SIZE;
100
101 /* an element? */
102 if (xs_type(p) == XSTYPE_LITEM) {
103@@ -923,7 +927,8 @@ xs_list *xs_list_cat(xs_list *l1, const xs_list *l2)
104 XS_ASSERT_TYPE(l2, XSTYPE_LIST);
105
106 /* inserts at the end of l1 the content of l2 (skipping header and footer) */
107- return xs_insert_m(l1, xs_size(l1) - 1, l2 + 4, xs_size(l2) - 5);
108+ return xs_insert_m(l1, xs_size(l1) - 1,
109+ l2 + 1 + _XS_TYPE_SIZE, xs_size(l2) - (1 + _XS_TYPE_SIZE + 1));
110 }
111
112
113@@ -986,7 +991,7 @@ int xs_dict_iter(xs_dict **dict, xs_str **key, xs_val **value)
114
115 /* skip the start of the list */
116 if (xs_type(p) == XSTYPE_DICT)
117- p += 4;
118+ p += 1 + _XS_TYPE_SIZE;
119
120 /* an element? */
121 if (xs_type(p) == XSTYPE_DITEM) {
122@@ -1145,15 +1150,15 @@ xs_data *xs_data_new(const void *data, int size)
123 {
124 xs_data *v;
125
126- /* add the overhead (data type + 24bit size) */
127- int total_size = size + 4;
128+ /* add the overhead (data type + size) */
129+ int total_size = size + 1 + _XS_TYPE_SIZE;
130
131 v = xs_realloc(NULL, _xs_blk_size(total_size));
132 v[0] = XSTYPE_DATA;
133
134- _xs_put_24b(v + 1, total_size);
135+ _xs_put_size(v + 1, total_size);
136
137- memcpy(&v[4], data, size);
138+ memcpy(&v[1 + _XS_TYPE_SIZE], data, size);
139
140 return v;
141 }
142@@ -1162,14 +1167,14 @@ xs_data *xs_data_new(const void *data, int size)
143 int xs_data_size(const xs_data *value)
144 /* returns the size of the data stored inside value */
145 {
146- return _xs_get_24b(value + 1) - 4;
147+ return _xs_get_size(value + 1) - (1 + _XS_TYPE_SIZE);
148 }
149
150
151 void xs_data_get(void *data, const xs_data *value)
152 /* copies the raw data stored inside value into data */
153 {
154- memcpy(data, &value[4], xs_data_size(value));
155+ memcpy(data, &value[1 + _XS_TYPE_SIZE], xs_data_size(value));
156 }
157
158