default 3 лет назад
Родитель
Сommit
273390b5bb
2 измененных файлов с 85 добавлено и 6 удалено
  1. 84 5
      xs.h
  2. 1 1
      xs_version.h

+ 84 - 5
xs.h

@@ -66,6 +66,11 @@ d_char *xs_list_append_m(d_char *list, const char *mem, int dsz);
 int xs_list_iter(char **list, char **value);
 int xs_list_len(char *list);
 char *xs_list_get(char *list, int num);
+d_char *xs_list_del(d_char *list, int num);
+d_char *xs_list_insert(d_char *list, int num, const char *data);
+d_char *xs_list_insert_sorted(d_char *list, const char *str);
+d_char *xs_list_set(d_char *list, int num, const char *data);
+d_char *xs_list_pop(d_char *list, char **data);
 int xs_list_in(char *list, const char *val);
 d_char *xs_join(char *list, const char *sep);
 d_char *xs_split_n(const char *str, const char *sep, int times);
@@ -464,19 +469,25 @@ d_char *xs_list_new(void)
 }
 
 
-d_char *xs_list_append_m(d_char *list, const char *mem, int dsz)
-/* adds a memory block to the list */
+d_char *_xs_list_write_litem(d_char *list, int offset, const char *mem, int dsz)
+/* writes a list item */
 {
     char c = XSTYPE_LITEM;
-    int lsz = xs_size(list);
 
-    list = xs_insert_m(list, lsz - 1, &c, 1);
-    list = xs_insert_m(list, lsz, mem, dsz);
+    list = xs_insert_m(list, offset,     &c,  1);
+    list = xs_insert_m(list, offset + 1, mem, dsz);
 
     return list;
 }
 
 
+d_char *xs_list_append_m(d_char *list, const char *mem, int dsz)
+/* adds a memory block to the list */
+{
+    return _xs_list_write_litem(list, xs_size(list) - 1, mem, dsz);
+}
+
+
 int xs_list_iter(char **list, char **value)
 /* iterates a list value */
 {
@@ -546,6 +557,74 @@ char *xs_list_get(char *list, int num)
 }
 
 
+d_char *xs_list_del(d_char *list, int num)
+/* deletes element #num */
+{
+    char *v;
+
+    if ((v = xs_list_get(list, num)) != NULL)
+        list = xs_collapse(list, v - 1 - list, xs_size(v - 1));
+
+    return list;
+}
+
+
+d_char *xs_list_insert(d_char *list, int num, const char *data)
+/* inserts an element at #num position */
+{
+    char *v;
+    int offset;
+
+    if ((v = xs_list_get(list, num)) != NULL)
+        offset = v - list;
+    else
+        offset = xs_size(list);
+
+    return _xs_list_write_litem(list, offset - 1, data, xs_size(data));
+}
+
+
+d_char *xs_list_insert_sorted(d_char *list, const char *str)
+/* inserts a string in the list in its ordered position */
+{
+    char *p, *v;
+    int offset = xs_size(list);
+
+    p = list;
+    while (xs_list_iter(&p, &v)) {
+        /* if this element is greater or equal, insert here */
+        if (strcmp(v, str) >= 0) {
+            offset = v - list;
+            break;
+        }
+    }
+
+    return _xs_list_write_litem(list, offset - 1, str, xs_size(str));
+}
+
+
+d_char *xs_list_set(d_char *list, int num, const char *data)
+/* sets the element at #num position */
+{
+    list = xs_list_del(list, num);
+    list = xs_list_insert(list, num, data);
+
+    return list;
+}
+
+
+d_char *xs_list_pop(d_char *list, char **data)
+/* pops the last element from the list */
+{
+    if ((*data = xs_list_get(list, -1)) != NULL) {
+        *data = xs_dup(*data);
+        list = xs_list_del(list, -1);
+    }
+
+    return list;
+}
+
+
 int xs_list_in(char *list, const char *val)
 /* returns the position of val in list or -1 */
 {

+ 1 - 1
xs_version.h

@@ -1 +1 @@
-/* 8450903c195f5a3bf4b96de961131d6e419321a4 */
+/* 1cde797082a259158b181f9c1e4bda4c5204109d */