commit cf1c2b1

default  ·  2024-04-22 05:31:50 +0000 UTC
parent 9cfce7a
Backport from xs.
2 files changed,  +43, -3
M xs.h
M xs.h
+42, -2
 1@@ -94,6 +94,7 @@ xs_list *xs_list_append_m(xs_list *list, const char *mem, int dsz);
 2 xs_list *_xs_list_append(xs_list *list, const xs_val *vals[]);
 3 #define xs_list_append(list, ...) _xs_list_append(list, (const xs_val *[]){ __VA_ARGS__, NULL })
 4 int xs_list_iter(xs_list **list, xs_val **value);
 5+int xs_list_next(const xs_list *list, xs_val **value, int *ctxt);
 6 int xs_list_len(const xs_list *list);
 7 xs_val *xs_list_get(const xs_list *list, int num);
 8 xs_list *xs_list_del(xs_list *list, int num);
 9@@ -752,6 +753,42 @@ int xs_list_iter(xs_list **list, xs_val **value)
10 }
11 
12 
13+int xs_list_next(const xs_list *list, xs_val **value, int *ctxt)
14+/* iterates a list, with context */
15+{
16+    if (xs_type(list) != XSTYPE_LIST)
17+        return 0;
18+
19+    int goon = 1;
20+
21+    char *p = (char *)list;
22+
23+    /* skip the start of the list */
24+    if (*ctxt == 0)
25+        *ctxt = 1 + _XS_TYPE_SIZE;
26+
27+    p += *ctxt;
28+
29+    /* an element? */
30+    if (xs_type(p) == XSTYPE_LITEM) {
31+        p++;
32+
33+        *value = p;
34+
35+        p += xs_size(*value);
36+    }
37+    else {
38+        /* end of list */
39+        goon = 0;
40+    }
41+
42+    /* update the context */
43+    *ctxt = p - list;
44+
45+    return goon;
46+}
47+
48+
49 int xs_list_len(const xs_list *list)
50 /* returns the number of elements in the list */
51 {
52@@ -1199,8 +1236,11 @@ double xs_number_get(const xs_number *v)
53 {
54     double f = 0.0;
55 
56-    if (v != NULL && v[0] == XSTYPE_NUMBER)
57+    if (xs_type(v) == XSTYPE_NUMBER)
58         f = atof(&v[1]);
59+    else
60+    if (xs_type(v) == XSTYPE_STRING)
61+        f = atof(v);
62 
63     return f;
64 }
65@@ -1211,7 +1251,7 @@ const char *xs_number_str(const xs_number *v)
66 {
67     const char *p = NULL;
68 
69-    if (v != NULL && v[0] == XSTYPE_NUMBER)
70+    if (xs_type(v) == XSTYPE_NUMBER)
71         p = &v[1];
72 
73     return p;
+1, -1
1@@ -1 +1 @@
2-/* f712d1336ef427c3b56305364b2687578537543f 2024-04-14T19:11:53+02:00 */
3+/* 0206a65508e86f66b6aa329418ddc8f6f8c1ecb2 2024-04-22T07:31:05+02:00 */