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
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 */