summaryrefslogtreecommitdiff
path: root/xs.h
diff options
context:
space:
mode:
authorGravatar default2023-03-18 10:28:04 +0100
committerGravatar default2023-03-18 10:28:04 +0100
commitefe0a0960ae15f553e405c4544048d033c21cd48 (patch)
treee1342a2ffe579ef14e3d0b6cf0fbc6af510d0ce6 /xs.h
parentVersion 2.25 RELEASED. (diff)
downloadsnac2-efe0a0960ae15f553e405c4544048d033c21cd48.tar.gz
snac2-efe0a0960ae15f553e405c4544048d033c21cd48.tar.xz
snac2-efe0a0960ae15f553e405c4544048d033c21cd48.zip
Backport from xs.
Diffstat (limited to 'xs.h')
-rw-r--r--xs.h24
1 files changed, 9 insertions, 15 deletions
diff --git a/xs.h b/xs.h
index 480db40..2fc7dda 100644
--- a/xs.h
+++ b/xs.h
@@ -69,8 +69,9 @@ xs_str *xs_replace_i(xs_str *str, const char *sfrom, const char *sto);
69#define xs_replace(str, sfrom, sto) xs_replace_i(xs_dup(str), sfrom, sto) 69#define xs_replace(str, sfrom, sto) xs_replace_i(xs_dup(str), sfrom, sto)
70xs_str *xs_fmt(const char *fmt, ...); 70xs_str *xs_fmt(const char *fmt, ...);
71int xs_str_in(const char *haystack, const char *needle); 71int xs_str_in(const char *haystack, const char *needle);
72int xs_startswith(const char *str, const char *prefix); 72int _xs_startsorends(const char *str, const char *xfix, int ends);
73int xs_endswith(const char *str, const char *postfix); 73#define xs_startswith(str, prefix) _xs_startsorends(str, prefix, 0)
74#define xs_endswith(str, postfix) _xs_startsorends(str, postfix, 1)
74xs_str *xs_crop_i(xs_str *str, int start, int end); 75xs_str *xs_crop_i(xs_str *str, int start, int end);
75xs_str *xs_strip_chars_i(xs_str *str, const char *chars); 76xs_str *xs_strip_chars_i(xs_str *str, const char *chars);
76#define xs_strip_i(str) xs_strip_chars_i(str, " \r\n\t\v\f") 77#define xs_strip_i(str) xs_strip_chars_i(str, " \r\n\t\v\f")
@@ -81,7 +82,7 @@ xs_list *xs_list_append_m(xs_list *list, const char *mem, int dsz);
81#define xs_list_append(list, data) xs_list_append_m(list, data, xs_size(data)) 82#define xs_list_append(list, data) xs_list_append_m(list, data, xs_size(data))
82int xs_list_iter(xs_list **list, xs_val **value); 83int xs_list_iter(xs_list **list, xs_val **value);
83int xs_list_len(const xs_list *list); 84int xs_list_len(const xs_list *list);
84char *xs_list_get(const xs_list *list, int num); 85xs_val *xs_list_get(const xs_list *list, int num);
85xs_list *xs_list_del(xs_list *list, int num); 86xs_list *xs_list_del(xs_list *list, int num);
86xs_list *xs_list_insert(xs_list *list, int num, const xs_val *data); 87xs_list *xs_list_insert(xs_list *list, int num, const xs_val *data);
87xs_list *xs_list_insert_sorted(xs_list *list, const char *str); 88xs_list *xs_list_insert_sorted(xs_list *list, const char *str);
@@ -100,7 +101,7 @@ xs_dict *xs_dict_append_m(xs_dict *dict, const xs_str *key, const xs_val *mem, i
100xs_dict *xs_dict_prepend_m(xs_dict *dict, const xs_str *key, const xs_val *mem, int dsz); 101xs_dict *xs_dict_prepend_m(xs_dict *dict, const xs_str *key, const xs_val *mem, int dsz);
101#define xs_dict_prepend(dict, key, data) xs_dict_prepend_m(dict, key, data, xs_size(data)) 102#define xs_dict_prepend(dict, key, data) xs_dict_prepend_m(dict, key, data, xs_size(data))
102int xs_dict_iter(xs_dict **dict, xs_str **key, xs_val **value); 103int xs_dict_iter(xs_dict **dict, xs_str **key, xs_val **value);
103xs_dict *xs_dict_get(const xs_dict *dict, const xs_str *key); 104xs_val *xs_dict_get(const xs_dict *dict, const xs_str *key);
104xs_dict *xs_dict_del(xs_dict *dict, const xs_str *key); 105xs_dict *xs_dict_del(xs_dict *dict, const xs_str *key);
105xs_dict *xs_dict_set(xs_dict *dict, const xs_str *key, const xs_val *data); 106xs_dict *xs_dict_set(xs_dict *dict, const xs_str *key, const xs_val *data);
106 107
@@ -475,20 +476,13 @@ int xs_str_in(const char *haystack, const char *needle)
475} 476}
476 477
477 478
478int xs_startswith(const char *str, const char *prefix) 479int _xs_startsorends(const char *str, const char *xfix, int ends)
479/* returns true if str starts with prefix */ 480/* returns true if str starts or ends with xfix */
480{
481 return !!(xs_str_in(str, prefix) == 0);
482}
483
484
485int xs_endswith(const char *str, const char *postfix)
486/* returns true if str ends with postfix */
487{ 481{
488 int ssz = strlen(str); 482 int ssz = strlen(str);
489 int psz = strlen(postfix); 483 int psz = strlen(xfix);
490 484
491 return !!(ssz >= psz && memcmp(postfix, str + ssz - psz, psz) == 0); 485 return !!(ssz >= psz && memcmp(xfix, str + (ends ? ssz - psz : 0), psz) == 0);
492} 486}
493 487
494 488