commit 273390b
default
·
2022-11-20 09:57:05 +0000 UTC
parent d253429
Backport from xs.
2 files changed,
+85,
-6
M
xs.h
M
xs.h
+84,
-5
1@@ -66,6 +66,11 @@ d_char *xs_list_append_m(d_char *list, const char *mem, int dsz);
2 int xs_list_iter(char **list, char **value);
3 int xs_list_len(char *list);
4 char *xs_list_get(char *list, int num);
5+d_char *xs_list_del(d_char *list, int num);
6+d_char *xs_list_insert(d_char *list, int num, const char *data);
7+d_char *xs_list_insert_sorted(d_char *list, const char *str);
8+d_char *xs_list_set(d_char *list, int num, const char *data);
9+d_char *xs_list_pop(d_char *list, char **data);
10 int xs_list_in(char *list, const char *val);
11 d_char *xs_join(char *list, const char *sep);
12 d_char *xs_split_n(const char *str, const char *sep, int times);
13@@ -464,19 +469,25 @@ d_char *xs_list_new(void)
14 }
15
16
17-d_char *xs_list_append_m(d_char *list, const char *mem, int dsz)
18-/* adds a memory block to the list */
19+d_char *_xs_list_write_litem(d_char *list, int offset, const char *mem, int dsz)
20+/* writes a list item */
21 {
22 char c = XSTYPE_LITEM;
23- int lsz = xs_size(list);
24
25- list = xs_insert_m(list, lsz - 1, &c, 1);
26- list = xs_insert_m(list, lsz, mem, dsz);
27+ list = xs_insert_m(list, offset, &c, 1);
28+ list = xs_insert_m(list, offset + 1, mem, dsz);
29
30 return list;
31 }
32
33
34+d_char *xs_list_append_m(d_char *list, const char *mem, int dsz)
35+/* adds a memory block to the list */
36+{
37+ return _xs_list_write_litem(list, xs_size(list) - 1, mem, dsz);
38+}
39+
40+
41 int xs_list_iter(char **list, char **value)
42 /* iterates a list value */
43 {
44@@ -546,6 +557,74 @@ char *xs_list_get(char *list, int num)
45 }
46
47
48+d_char *xs_list_del(d_char *list, int num)
49+/* deletes element #num */
50+{
51+ char *v;
52+
53+ if ((v = xs_list_get(list, num)) != NULL)
54+ list = xs_collapse(list, v - 1 - list, xs_size(v - 1));
55+
56+ return list;
57+}
58+
59+
60+d_char *xs_list_insert(d_char *list, int num, const char *data)
61+/* inserts an element at #num position */
62+{
63+ char *v;
64+ int offset;
65+
66+ if ((v = xs_list_get(list, num)) != NULL)
67+ offset = v - list;
68+ else
69+ offset = xs_size(list);
70+
71+ return _xs_list_write_litem(list, offset - 1, data, xs_size(data));
72+}
73+
74+
75+d_char *xs_list_insert_sorted(d_char *list, const char *str)
76+/* inserts a string in the list in its ordered position */
77+{
78+ char *p, *v;
79+ int offset = xs_size(list);
80+
81+ p = list;
82+ while (xs_list_iter(&p, &v)) {
83+ /* if this element is greater or equal, insert here */
84+ if (strcmp(v, str) >= 0) {
85+ offset = v - list;
86+ break;
87+ }
88+ }
89+
90+ return _xs_list_write_litem(list, offset - 1, str, xs_size(str));
91+}
92+
93+
94+d_char *xs_list_set(d_char *list, int num, const char *data)
95+/* sets the element at #num position */
96+{
97+ list = xs_list_del(list, num);
98+ list = xs_list_insert(list, num, data);
99+
100+ return list;
101+}
102+
103+
104+d_char *xs_list_pop(d_char *list, char **data)
105+/* pops the last element from the list */
106+{
107+ if ((*data = xs_list_get(list, -1)) != NULL) {
108+ *data = xs_dup(*data);
109+ list = xs_list_del(list, -1);
110+ }
111+
112+ return list;
113+}
114+
115+
116 int xs_list_in(char *list, const char *val)
117 /* returns the position of val in list or -1 */
118 {
+1,
-1
1@@ -1 +1 @@
2-/* 8450903c195f5a3bf4b96de961131d6e419321a4 */
3+/* 1cde797082a259158b181f9c1e4bda4c5204109d */