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