commit b75e44a

default  ·  2024-02-15 16:44:28 +0000 UTC
parent 263e239
Backport from xs.
3 files changed,  +22, -25
M xs.h
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 */