commit 273390b

default  ·  2022-11-20 09:57:05 +0000 UTC
parent d253429
Backport from xs.
2 files changed,  +85, -6
M xs.h
M xs.h
+84, -5
  1@@ -66,6 +66,11 @@ d_char *xs_list_append_m(d_char *list, const char *mem, int dsz);
  2 int xs_list_iter(char **list, char **value);
  3 int xs_list_len(char *list);
  4 char *xs_list_get(char *list, int num);
  5+d_char *xs_list_del(d_char *list, int num);
  6+d_char *xs_list_insert(d_char *list, int num, const char *data);
  7+d_char *xs_list_insert_sorted(d_char *list, const char *str);
  8+d_char *xs_list_set(d_char *list, int num, const char *data);
  9+d_char *xs_list_pop(d_char *list, char **data);
 10 int xs_list_in(char *list, const char *val);
 11 d_char *xs_join(char *list, const char *sep);
 12 d_char *xs_split_n(const char *str, const char *sep, int times);
 13@@ -464,19 +469,25 @@ d_char *xs_list_new(void)
 14 }
 15 
 16 
 17-d_char *xs_list_append_m(d_char *list, const char *mem, int dsz)
 18-/* adds a memory block to the list */
 19+d_char *_xs_list_write_litem(d_char *list, int offset, const char *mem, int dsz)
 20+/* writes a list item */
 21 {
 22     char c = XSTYPE_LITEM;
 23-    int lsz = xs_size(list);
 24 
 25-    list = xs_insert_m(list, lsz - 1, &c, 1);
 26-    list = xs_insert_m(list, lsz, mem, dsz);
 27+    list = xs_insert_m(list, offset,     &c,  1);
 28+    list = xs_insert_m(list, offset + 1, mem, dsz);
 29 
 30     return list;
 31 }
 32 
 33 
 34+d_char *xs_list_append_m(d_char *list, const char *mem, int dsz)
 35+/* adds a memory block to the list */
 36+{
 37+    return _xs_list_write_litem(list, xs_size(list) - 1, mem, dsz);
 38+}
 39+
 40+
 41 int xs_list_iter(char **list, char **value)
 42 /* iterates a list value */
 43 {
 44@@ -546,6 +557,74 @@ char *xs_list_get(char *list, int num)
 45 }
 46 
 47 
 48+d_char *xs_list_del(d_char *list, int num)
 49+/* deletes element #num */
 50+{
 51+    char *v;
 52+
 53+    if ((v = xs_list_get(list, num)) != NULL)
 54+        list = xs_collapse(list, v - 1 - list, xs_size(v - 1));
 55+
 56+    return list;
 57+}
 58+
 59+
 60+d_char *xs_list_insert(d_char *list, int num, const char *data)
 61+/* inserts an element at #num position */
 62+{
 63+    char *v;
 64+    int offset;
 65+
 66+    if ((v = xs_list_get(list, num)) != NULL)
 67+        offset = v - list;
 68+    else
 69+        offset = xs_size(list);
 70+
 71+    return _xs_list_write_litem(list, offset - 1, data, xs_size(data));
 72+}
 73+
 74+
 75+d_char *xs_list_insert_sorted(d_char *list, const char *str)
 76+/* inserts a string in the list in its ordered position */
 77+{
 78+    char *p, *v;
 79+    int offset = xs_size(list);
 80+
 81+    p = list;
 82+    while (xs_list_iter(&p, &v)) {
 83+        /* if this element is greater or equal, insert here */
 84+        if (strcmp(v, str) >= 0) {
 85+            offset = v - list;
 86+            break;
 87+        }
 88+    }
 89+
 90+    return _xs_list_write_litem(list, offset - 1, str, xs_size(str));
 91+}
 92+
 93+
 94+d_char *xs_list_set(d_char *list, int num, const char *data)
 95+/* sets the element at #num position */
 96+{
 97+    list = xs_list_del(list, num);
 98+    list = xs_list_insert(list, num, data);
 99+
100+    return list;
101+}
102+
103+
104+d_char *xs_list_pop(d_char *list, char **data)
105+/* pops the last element from the list */
106+{
107+    if ((*data = xs_list_get(list, -1)) != NULL) {
108+        *data = xs_dup(*data);
109+        list = xs_list_del(list, -1);
110+    }
111+
112+    return list;
113+}
114+
115+
116 int xs_list_in(char *list, const char *val)
117 /* returns the position of val in list or -1 */
118 {
+1, -1
1@@ -1 +1 @@
2-/* 8450903c195f5a3bf4b96de961131d6e419321a4 */
3+/* 1cde797082a259158b181f9c1e4bda4c5204109d */