commit c60a4d9
default
·
2022-12-06 18:12:26 +0000 UTC
parent 345f644
Backport from xs.
2 files changed,
+41,
-20
M
xs.h
M
xs.h
+40,
-19
1@@ -200,11 +200,30 @@ xstype xs_type(const char *data)
2 }
3
4
5+void _xs_put_24b(char *ptr, int i)
6+/* writes i as a 24 bit value */
7+{
8+ unsigned char *p = (unsigned char *)ptr;
9+
10+ p[0] = (i >> 16) & 0xff;
11+ p[1] = (i >> 8) & 0xff;
12+ p[2] = i & 0xff;
13+}
14+
15+
16+int _xs_get_24b(const char *ptr)
17+/* reads a 24 bit value */
18+{
19+ unsigned char *p = (unsigned char *)ptr;
20+
21+ return (p[0] << 16) | (p[1] << 8) | p[2];
22+}
23+
24+
25 int xs_size(const char *data)
26 /* returns the size of data in bytes */
27 {
28 int len = 0;
29- int c = 0;
30 const char *p;
31
32 if (data == NULL)
33@@ -216,20 +235,12 @@ int xs_size(const char *data)
34 break;
35
36 case XSTYPE_LIST:
37- /* look for a balanced EOL */
38- do {
39- c += data[len] == XSTYPE_LIST ? 1 : data[len] == XSTYPE_EOL ? -1 : 0;
40- len++;
41- } while (c);
42+ len = _xs_get_24b(data + 1);
43
44 break;
45
46 case XSTYPE_DICT:
47- /* look for a balanced EOD */
48- do {
49- c += data[len] == XSTYPE_DICT ? 1 : data[len] == XSTYPE_EOD ? -1 : 0;
50- len++;
51- } while (c);
52+ len = _xs_get_24b(data + 1);
53
54 break;
55
56@@ -297,6 +308,9 @@ d_char *xs_expand(d_char *data, int offset, int size)
57 if (data != NULL)
58 memmove(data + offset + size, data + offset, sz - offset);
59
60+ if (xs_type(data) == XSTYPE_LIST || xs_type(data) == XSTYPE_DICT)
61+ _xs_put_24b(data + 1, sz + size);
62+
63 return data;
64 }
65
66@@ -317,6 +331,9 @@ d_char *xs_collapse(d_char *data, int offset, int size)
67 for (n = offset; n < sz; n++)
68 data[n] = data[n + size];
69
70+ if (xs_type(data) == XSTYPE_LIST || xs_type(data) == XSTYPE_DICT)
71+ _xs_put_24b(data + 1, sz);
72+
73 return xs_realloc(data, _xs_blk_size(sz));
74 }
75
76@@ -464,9 +481,11 @@ d_char *xs_list_new(void)
77 {
78 d_char *list;
79
80- list = xs_realloc(NULL, _xs_blk_size(2));
81+ list = xs_realloc(NULL, _xs_blk_size(5));
82 list[0] = XSTYPE_LIST;
83- list[1] = XSTYPE_EOL;
84+ list[4] = XSTYPE_EOL;
85+
86+ _xs_put_24b(list + 1, 5);
87
88 return list;
89 }
90@@ -502,9 +521,9 @@ int xs_list_iter(char **list, char **value)
91
92 p = *list;
93
94- /* skip a possible start of the list */
95+ /* skip the start of the list */
96 if (*p == XSTYPE_LIST)
97- p++;
98+ p += 4;
99
100 /* an element? */
101 if (*p == XSTYPE_LITEM) {
102@@ -709,9 +728,11 @@ d_char *xs_dict_new(void)
103 {
104 d_char *dict;
105
106- dict = xs_realloc(NULL, _xs_blk_size(2));
107+ dict = xs_realloc(NULL, _xs_blk_size(5));
108 dict[0] = XSTYPE_DICT;
109- dict[1] = XSTYPE_EOD;
110+ dict[4] = XSTYPE_EOD;
111+
112+ _xs_put_24b(dict + 1, 5);
113
114 return dict;
115 }
116@@ -743,9 +764,9 @@ int xs_dict_iter(char **dict, char **key, char **value)
117
118 p = *dict;
119
120- /* skip a possible start of the list */
121+ /* skip the start of the list */
122 if (*p == XSTYPE_DICT)
123- p++;
124+ p += 4;
125
126 /* an element? */
127 if (*p == XSTYPE_DITEM) {
+1,
-1
1@@ -1 +1 @@
2-/* c18371e1f1d3de0f872354f93024a736caebea4d */
3+/* a4ce4b2c0c9cd7c40aedd31eb352e3b979de3a17 */