summaryrefslogtreecommitdiff
path: root/xs.h
diff options
context:
space:
mode:
authordefault <nobody@localhost>2022-11-20 10:57:05 +0100
committerdefault <nobody@localhost>2022-11-20 10:57:05 +0100
commit273390b5bb3a803bc91f10e03543b60b561ffbcd (patch)
treebb1a2e41e529f45ff5f27025f6b55291faa62106 /xs.h
parentd253429fe7d6596533166499d110b6eea4a0af89 (diff)
Backport from xs.
Diffstat (limited to 'xs.h')
-rw-r--r--xs.h89
1 files changed, 84 insertions, 5 deletions
diff --git a/xs.h b/xs.h
index 5aed922..da853f5 100644
--- a/xs.h
+++ b/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 */
{