commit 2ee6bdc
default
·
2023-02-06 10:09:11 +0000 UTC
parent 66d974a
Backport from xs.
2 files changed,
+53,
-9
M
xs.h
M
xs.h
+52,
-8
1@@ -15,7 +15,7 @@
2
3 typedef enum {
4 XSTYPE_STRING = 0x02, /* C string (\0 delimited) (NOT STORED) */
5- XSTYPE_NUMBER = 0x17, /* C string (\0 delimited) */
6+ XSTYPE_NUMBER = 0x17, /* double in spirit, stored as a C string (\0 delimited) */
7 XSTYPE_NULL = 0x18, /* Special NULL value */
8 XSTYPE_TRUE = 0x06, /* Boolean */
9 XSTYPE_FALSE = 0x15, /* Boolean */
10@@ -23,7 +23,8 @@ typedef enum {
11 XSTYPE_LITEM = 0x1f, /* Element of a list (any type) */
12 XSTYPE_DICT = 0x1c, /* Sequence of DITEMs up to EOM (with 24bit size) */
13 XSTYPE_DITEM = 0x1e, /* Element of a dict (STRING key + any type) */
14- XSTYPE_EOM = 0x19 /* End of Multiple (LIST or DICT) */
15+ XSTYPE_EOM = 0x19, /* End of Multiple (LIST or DICT) */
16+ XSTYPE_DATA = 0x10 /* A block of anonymous data */
17 } xstype;
18
19
20@@ -36,6 +37,7 @@ typedef char xs_str;
21 typedef char xs_list;
22 typedef char xs_dict;
23 typedef char xs_number;
24+typedef char xs_data;
25
26 /* auto-destroyable strings */
27 #define xs __attribute__ ((__cleanup__ (_xs_destroy))) xs_val
28@@ -105,6 +107,10 @@ xs_number *xs_number_new(double f);
29 double xs_number_get(const xs_number *v);
30 const char *xs_number_str(const xs_number *v);
31
32+xs_data *xs_data_new(const void *data, int size);
33+int xs_data_size(const xs_data *value);
34+void xs_data_get(const xs_data *value, void *data);
35+
36 void *xs_memmem(const char *haystack, int h_size, const char *needle, int n_size);
37
38
39@@ -222,6 +228,7 @@ xstype xs_type(const xs_val *data)
40 case XSTYPE_DITEM:
41 case XSTYPE_NUMBER:
42 case XSTYPE_EOM:
43+ case XSTYPE_DATA:
44 t = data[0];
45 break;
46 default:
47@@ -268,11 +275,8 @@ int xs_size(const xs_val *data)
48 break;
49
50 case XSTYPE_LIST:
51- len = _xs_get_24b(data + 1);
52-
53- break;
54-
55 case XSTYPE_DICT:
56+ case XSTYPE_DATA:
57 len = _xs_get_24b(data + 1);
58
59 break;
60@@ -341,7 +345,9 @@ xs_val *xs_expand(xs_val *data, int offset, int size)
61 if (data != NULL)
62 memmove(data + offset + size, data + offset, sz - offset);
63
64- if (xs_type(data) == XSTYPE_LIST || xs_type(data) == XSTYPE_DICT)
65+ if (xs_type(data) == XSTYPE_LIST ||
66+ xs_type(data) == XSTYPE_DICT ||
67+ xs_type(data) == XSTYPE_DATA)
68 _xs_put_24b(data + 1, sz + size);
69
70 return data;
71@@ -364,7 +370,9 @@ xs_val *xs_collapse(xs_val *data, int offset, int size)
72 for (n = offset; n < sz; n++)
73 data[n] = data[n + size];
74
75- if (xs_type(data) == XSTYPE_LIST || xs_type(data) == XSTYPE_DICT)
76+ if (xs_type(data) == XSTYPE_LIST ||
77+ xs_type(data) == XSTYPE_DICT ||
78+ xs_type(data) == XSTYPE_DATA)
79 _xs_put_24b(data + 1, sz);
80
81 return xs_realloc(data, _xs_blk_size(sz));
82@@ -1030,6 +1038,42 @@ const char *xs_number_str(const xs_number *v)
83 }
84
85
86+/* raw data blocks */
87+
88+xs_data *xs_data_new(const void *data, int size)
89+/* returns a new raw data value */
90+{
91+ xs_data *v;
92+
93+ /* add the overhead (data type + 24bit size) */
94+ size += 4;
95+
96+ v = xs_realloc(NULL, _xs_blk_size(size));
97+ v[0] = XSTYPE_DATA;
98+
99+ _xs_put_24b(v + 1, size);
100+
101+ memcpy(&v[4], data, size);
102+
103+ return v;
104+}
105+
106+
107+int xs_data_size(const xs_data *value)
108+/* returns the size of the data stored inside value */
109+{
110+ return _xs_get_24b(value + 1) - 4;
111+}
112+
113+
114+void xs_data_get(const xs_data *value, void *data)
115+/* copies the raw data stored inside value into data */
116+{
117+ int size = _xs_get_24b(value + 1) - 4;
118+ memcpy(data, &value[4], size);
119+}
120+
121+
122 void *xs_memmem(const char *haystack, int h_size, const char *needle, int n_size)
123 /* clone of memmem */
124 {
+1,
-1
1@@ -1 +1 @@
2-/* 452a86b01d695705a3f61a9b26208855c11118b1 */
3+/* 79e4ff3403fbbd78f57482122a2478c9453483a8 */