diff options
author | default <nobody@localhost> | 2024-02-15 17:44:28 +0100 |
---|---|---|
committer | default <nobody@localhost> | 2024-02-15 17:44:28 +0100 |
commit | b75e44afb38bef99bc932942ff4ba4286b774507 (patch) | |
tree | 07a3d3a1bf552bf6287c20e9ec7e6e5bbe73774c /xs.h | |
parent | 263e239653b79d230a7546b9db89ff71dc0f2a53 (diff) |
Backport from xs.
Diffstat (limited to 'xs.h')
-rw-r--r-- | xs.h | 35 |
1 files changed, 12 insertions, 23 deletions
@@ -54,6 +54,7 @@ void _xs_destroy(char **var); xstype xs_type(const xs_val *data); int xs_size(const xs_val *data); int xs_is_null(const xs_val *data); +int xs_cmp(const xs_val *v1, const xs_val *v2); xs_val *xs_dup(const xs_val *data); xs_val *xs_expand(xs_val *data, int offset, int size); xs_val *xs_collapse(xs_val *data, int offset, int size); @@ -91,7 +92,6 @@ int xs_list_len(const xs_list *list); xs_val *xs_list_get(const xs_list *list, int num); xs_list *xs_list_del(xs_list *list, int num); xs_list *xs_list_insert(xs_list *list, int num, const xs_val *data); -xs_list *xs_list_insert_sorted(xs_list *list, const char *str); xs_list *xs_list_set(xs_list *list, int num, const xs_val *data); xs_list *xs_list_dequeue(xs_list *list, xs_val **data, int last); #define xs_list_pop(list, data) xs_list_dequeue(list, data, 1) @@ -350,6 +350,17 @@ int xs_is_null(const xs_val *data) } +int xs_cmp(const xs_val *v1, const xs_val *v2) +/* compares two values */ +{ + int s1 = xs_size(v1); + int s2 = xs_size(v2); + int d = s1 - s2; + + return d == 0 ? memcmp(v1, v2, s1) : d; +} + + xs_val *xs_dup(const xs_val *data) /* creates a duplicate of data */ { @@ -767,28 +778,6 @@ xs_list *xs_list_insert(xs_list *list, int num, const xs_val *data) } -xs_list *xs_list_insert_sorted(xs_list *list, const xs_str *str) -/* inserts a string in the list in its ordered position */ -{ - XS_ASSERT_TYPE(list, XSTYPE_LIST); - XS_ASSERT_TYPE(str, XSTYPE_STRING); - - 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)); -} - - xs_list *xs_list_set(xs_list *list, int num, const xs_val *data) /* sets the element at #num position */ { |