commit b75e44a
default
·
2024-02-15 16:44:28 +0000 UTC
parent 263e239
Backport from xs.
3 files changed,
+22,
-25
M
xs.h
+12,
-23
1@@ -54,6 +54,7 @@ void _xs_destroy(char **var);
2 xstype xs_type(const xs_val *data);
3 int xs_size(const xs_val *data);
4 int xs_is_null(const xs_val *data);
5+int xs_cmp(const xs_val *v1, const xs_val *v2);
6 xs_val *xs_dup(const xs_val *data);
7 xs_val *xs_expand(xs_val *data, int offset, int size);
8 xs_val *xs_collapse(xs_val *data, int offset, int size);
9@@ -91,7 +92,6 @@ int xs_list_len(const xs_list *list);
10 xs_val *xs_list_get(const xs_list *list, int num);
11 xs_list *xs_list_del(xs_list *list, int num);
12 xs_list *xs_list_insert(xs_list *list, int num, const xs_val *data);
13-xs_list *xs_list_insert_sorted(xs_list *list, const char *str);
14 xs_list *xs_list_set(xs_list *list, int num, const xs_val *data);
15 xs_list *xs_list_dequeue(xs_list *list, xs_val **data, int last);
16 #define xs_list_pop(list, data) xs_list_dequeue(list, data, 1)
17@@ -350,6 +350,17 @@ int xs_is_null(const xs_val *data)
18 }
19
20
21+int xs_cmp(const xs_val *v1, const xs_val *v2)
22+/* compares two values */
23+{
24+ int s1 = xs_size(v1);
25+ int s2 = xs_size(v2);
26+ int d = s1 - s2;
27+
28+ return d == 0 ? memcmp(v1, v2, s1) : d;
29+}
30+
31+
32 xs_val *xs_dup(const xs_val *data)
33 /* creates a duplicate of data */
34 {
35@@ -767,28 +778,6 @@ xs_list *xs_list_insert(xs_list *list, int num, const xs_val *data)
36 }
37
38
39-xs_list *xs_list_insert_sorted(xs_list *list, const xs_str *str)
40-/* inserts a string in the list in its ordered position */
41-{
42- XS_ASSERT_TYPE(list, XSTYPE_LIST);
43- XS_ASSERT_TYPE(str, XSTYPE_STRING);
44-
45- char *p, *v;
46- int offset = xs_size(list);
47-
48- p = list;
49- while (xs_list_iter(&p, &v)) {
50- /* if this element is greater or equal, insert here */
51- if (strcmp(v, str) >= 0) {
52- offset = v - list;
53- break;
54- }
55- }
56-
57- return _xs_list_write_litem(list, offset - 1, str, xs_size(str));
58-}
59-
60-
61 xs_list *xs_list_set(xs_list *list, int num, const xs_val *data)
62 /* sets the element at #num position */
63 {
+9,
-1
1@@ -5,6 +5,7 @@
2 #define _XS_UNICODE_H
3
4 int _xs_utf8_enc(char buf[4], unsigned int cpoint);
5+ int xs_is_utf8_cont_byte(char c);
6 unsigned int xs_utf8_dec(char **str);
7 int xs_unicode_width(unsigned int cpoint);
8 int xs_is_surrogate(unsigned int cpoint);
9@@ -58,6 +59,13 @@ int _xs_utf8_enc(char buf[4], unsigned int cpoint)
10 }
11
12
13+int xs_is_utf8_cont_byte(char c)
14+/* returns true if c is an utf8 continuation byte */
15+{
16+ return ((c & 0xc0) == 0x80);
17+}
18+
19+
20 unsigned int xs_utf8_dec(char **str)
21 /* decodes an utf-8 char inside str and updates the pointer */
22 {
23@@ -86,7 +94,7 @@ unsigned int xs_utf8_dec(char **str)
24 }
25
26 /* process the continuation bytes */
27- while (cb > 0 && *p && (*p & 0xc0) == 0x80)
28+ while (cb > 0 && *p && xs_is_utf8_cont_byte(*p))
29 cpoint |= (*p++ & 0x3f) << (--cb * 6);
30
31 /* incomplete or broken? */
+1,
-1
1@@ -1 +1 @@
2-/* 72caf9fc60c0b90f39a3c62b238d1c9663d109bc 2024-01-07T09:26:08+01:00 */
3+/* e277e59e0ccbe2111aaf884c85ccadeebabd5281 2024-01-30T13:56:36+01:00 */