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