commit 0b3e9eb
grunfink
·
2026-06-24 09:39:39 +0000 UTC
parent 84084ee
Moved xs_list_reverse() to xs.h.
3 files changed,
+49,
-25
M
xs.h
+48,
-0
1@@ -98,6 +98,8 @@ xs_list *_xs_list_append(xs_list *list, const xs_val *vals[]);
2 #define xs_list_append(list, ...) _xs_list_append(list, (const xs_val *[]){ __VA_ARGS__, NULL })
3 int xs_list_iter(xs_list **list, const xs_val **value);
4 int xs_list_next(const xs_list *list, const xs_val **value, int *ctxt);
5+int xs_list_cap(xs_list *list, int max);
6+xs_list *xs_list_reverse(const xs_list *l);
7 int xs_list_len(const xs_list *list);
8 const xs_val *xs_list_get(const xs_list *list, int num);
9 xs_list *xs_list_del(xs_list *list, int num);
10@@ -851,6 +853,52 @@ int xs_list_next(const xs_list *list, const xs_val **value, int *ctxt)
11 }
12
13
14+int xs_list_cap(xs_list *list, int max)
15+/* caps the list to have a maximum of max items */
16+{
17+ int n, ctxt = 0;
18+ const char *v;
19+
20+ /* advance upto max elements */
21+ for (n = 0; n < max + 1 && xs_list_next(list, &v, &ctxt); n++);
22+
23+ /* more than max items? */
24+ if (n == max + 1) {
25+ /* insert an end of list over the XSTYPE_LITEM of the old item */
26+ char *p = (char *)v;
27+ p[-1] = '\0';
28+
29+ /* rewrite the list len */
30+ _xs_put_size(list, p - list);
31+ }
32+
33+ return n == max + 1;
34+}
35+
36+
37+xs_list *xs_list_reverse(const xs_list *l)
38+/* creates a new list as a reverse version of l */
39+{
40+ xs_list *n = xs_dup(l);
41+ const xs_val *v;
42+
43+ /* move to one byte before the EOM */
44+ char *p = n + xs_size(n) - 1;
45+
46+ xs_list_foreach(l, v) {
47+ /* size of v, plus the LITEM */
48+ int z = xs_size(v) + 1;
49+
50+ p -= z;
51+
52+ /* copy v, including its LITEM */
53+ memcpy(p, v - 1, z);
54+ }
55+
56+ return n;
57+}
58+
59+
60 int xs_list_len(const xs_list *list)
61 /* returns the number of elements in the list */
62 {
+0,
-24
1@@ -5,7 +5,6 @@
2 #define _XS_LIST_TOOLS_H
3
4 xs_list *xs_list_insert_sorted(xs_list *list, const xs_val *nv);
5- xs_list *xs_list_reverse(const xs_list *l);
6 xs_val **xs_list_to_array(const xs_list *l, int *len);
7 int xs_list_sort_cmp(const void *p1, const void *p2);
8 int xs_list_sort_inv_cmp(const void *p1, const void *p2);
9@@ -37,29 +36,6 @@ xs_list *xs_list_insert_sorted(xs_list *list, const xs_val *nv)
10 }
11
12
13-xs_list *xs_list_reverse(const xs_list *l)
14-/* creates a new list as a reverse version of l */
15-{
16- xs_list *n = xs_dup(l);
17- const xs_val *v;
18-
19- /* move to one byte before the EOM */
20- char *p = n + xs_size(n) - 1;
21-
22- xs_list_foreach(l, v) {
23- /* size of v, plus the LITEM */
24- int z = xs_size(v) + 1;
25-
26- p -= z;
27-
28- /* copy v, including its LITEM */
29- memcpy(p, v - 1, z);
30- }
31-
32- return n;
33-}
34-
35-
36 xs_val **xs_list_to_array(const xs_list *l, int *len)
37 /* converts a list to an array of values */
38 /* must be freed after use */
+1,
-1
1@@ -1 +1 @@
2-/* 2e209276f3f598dbee88350a33291198ab792eb2 2026-06-03T19:54:14+02:00 */
3+/* 4110cac45d3d8a6c86b6552c59ec9c73d7a3a4c0 2026-06-17T11:46:41+02:00 */