commit 19ed903
default
·
2023-02-16 08:32:42 +0000 UTC
parent 75fbc38
Backport from xs.
2 files changed,
+27,
-10
M
xs.h
M
xs.h
+26,
-9
1@@ -97,6 +97,8 @@ xs_list *xs_split_n(const char *str, const char *sep, int times);
2 xs_dict *xs_dict_new(void);
3 xs_dict *xs_dict_append_m(xs_dict *dict, const xs_str *key, const xs_val *mem, int dsz);
4 #define xs_dict_append(dict, key, data) xs_dict_append_m(dict, key, data, xs_size(data))
5+xs_dict *xs_dict_prepend_m(xs_dict *dict, const xs_str *key, const xs_val *mem, int dsz);
6+#define xs_dict_prepend(dict, key, data) xs_dict_prepend_m(dict, key, data, xs_size(data))
7 int xs_dict_iter(xs_dict **dict, xs_str **key, xs_val **value);
8 xs_dict *xs_dict_get(const xs_dict *dict, const xs_str *key);
9 xs_dict *xs_dict_del(xs_dict *dict, const xs_str *key);
10@@ -859,24 +861,39 @@ xs_dict *xs_dict_new(void)
11 }
12
13
14-xs_dict *xs_dict_append_m(xs_dict *dict, const xs_str *key, const xs_val *mem, int dsz)
15-/* adds a memory block to the dict */
16+xs_dict *xs_dict_insert_m(xs_dict *dict, int offset, const xs_str *key,
17+ const xs_val *data, int dsz)
18+/* inserts a memory block into the dict */
19 {
20 XS_ASSERT_TYPE(dict, XSTYPE_DICT);
21 XS_ASSERT_TYPE(key, XSTYPE_STRING);
22
23- char c = XSTYPE_DITEM;
24- int sz = xs_size(dict);
25 int ksz = xs_size(key);
26
27- dict = xs_insert_m(dict, sz - 1, &c, 1);
28- dict = xs_insert_m(dict, sz, key, ksz);
29- dict = xs_insert_m(dict, sz + ksz, mem, dsz);
30+ dict = xs_expand(dict, offset, 1 + ksz + dsz);
31+
32+ dict[offset] = XSTYPE_DITEM;
33+ memcpy(&dict[offset + 1], key, ksz);
34+ memcpy(&dict[offset + 1 + ksz], data, dsz);
35
36 return dict;
37 }
38
39
40+xs_dict *xs_dict_append_m(xs_dict *dict, const xs_str *key, const xs_val *mem, int dsz)
41+/* appends a memory block to the dict */
42+{
43+ return xs_dict_insert_m(dict, xs_size(dict) - 1, key, mem, dsz);
44+}
45+
46+
47+xs_dict *xs_dict_prepend_m(xs_dict *dict, const xs_str *key, const xs_val *mem, int dsz)
48+/* prepends a memory block to the dict */
49+{
50+ return xs_dict_insert_m(dict, 4, key, mem, dsz);
51+}
52+
53+
54 int xs_dict_iter(xs_dict **dict, xs_str **key, xs_val **value)
55 /* iterates a dict value */
56 {
57@@ -962,8 +979,8 @@ xs_dict *xs_dict_set(xs_dict *dict, const xs_str *key, const xs_val *data)
58 /* delete the possibly existing key */
59 dict = xs_dict_del(dict, key);
60
61- /* append the data */
62- dict = xs_dict_append(dict, key, data);
63+ /* add the data */
64+ dict = xs_dict_prepend(dict, key, data);
65
66 return dict;
67 }
+1,
-1
1@@ -1 +1 @@
2-/* 79e4ff3403fbbd78f57482122a2478c9453483a8 */
3+/* a2221e4e87e4c2e0a92a4934f88e78ca7e8e7f7f */