diff options
author | default <nobody@localhost> | 2022-11-20 10:57:05 +0100 |
---|---|---|
committer | default <nobody@localhost> | 2022-11-20 10:57:05 +0100 |
commit | 273390b5bb3a803bc91f10e03543b60b561ffbcd (patch) | |
tree | bb1a2e41e529f45ff5f27025f6b55291faa62106 /xs.h | |
parent | d253429fe7d6596533166499d110b6eea4a0af89 (diff) |
Backport from xs.
Diffstat (limited to 'xs.h')
-rw-r--r-- | xs.h | 89 |
1 files changed, 84 insertions, 5 deletions
@@ -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 */ { |