summaryrefslogtreecommitdiff
path: root/xs.h
diff options
context:
space:
mode:
authorGravatar default2023-09-13 18:19:19 +0200
committerGravatar default2023-09-13 18:19:19 +0200
commit4105e737e6ec9b9d8aca508ac5bedb69947b202d (patch)
treef90686ed12ef4ea2b50e65ddeee42bf3650144eb /xs.h
parentUpdated RELEASE_NOTES. (diff)
downloadpenes-snac2-4105e737e6ec9b9d8aca508ac5bedb69947b202d.tar.gz
penes-snac2-4105e737e6ec9b9d8aca508ac5bedb69947b202d.tar.xz
penes-snac2-4105e737e6ec9b9d8aca508ac5bedb69947b202d.zip
Backport from xs.
Diffstat (limited to '')
-rw-r--r--xs.h57
1 files changed, 39 insertions, 18 deletions
diff --git a/xs.h b/xs.h
index 6ac70bf..40dd706 100644
--- a/xs.h
+++ b/xs.h
@@ -59,6 +59,7 @@ xs_val *xs_insert_m(xs_val *data, int offset, const char *mem, int size);
59#define xs_append_m(data, mem, size) xs_insert_m(data, xs_size(data) - 1, mem, size) 59#define xs_append_m(data, mem, size) xs_insert_m(data, xs_size(data) - 1, mem, size)
60 60
61xs_str *xs_str_new(const char *str); 61xs_str *xs_str_new(const char *str);
62xs_str *xs_str_new_sz(const char *mem, int sz);
62xs_str *xs_str_wrap_i(const char *prefix, xs_str *str, const char *suffix); 63xs_str *xs_str_wrap_i(const char *prefix, xs_str *str, const char *suffix);
63#define xs_str_prepend_i(str, prefix) xs_str_wrap_i(prefix, str, NULL) 64#define xs_str_prepend_i(str, prefix) xs_str_wrap_i(prefix, str, NULL)
64#define xs_str_cat(str, suffix) xs_str_wrap_i(NULL, str, suffix) 65#define xs_str_cat(str, suffix) xs_str_wrap_i(NULL, str, suffix)
@@ -72,6 +73,8 @@ int xs_starts_and_ends(const char *prefix, const char *str, const char *suffix);
72#define xs_startswith(str, prefix) xs_starts_and_ends(prefix, str, NULL) 73#define xs_startswith(str, prefix) xs_starts_and_ends(prefix, str, NULL)
73#define xs_endswith(str, suffix) xs_starts_and_ends(NULL, str, suffix) 74#define xs_endswith(str, suffix) xs_starts_and_ends(NULL, str, suffix)
74xs_str *xs_crop_i(xs_str *str, int start, int end); 75xs_str *xs_crop_i(xs_str *str, int start, int end);
76xs_str *xs_lstrip_chars_i(xs_str *str, const char *chars);
77xs_str *xs_rstrip_chars_i(xs_str *str, const char *chars);
75xs_str *xs_strip_chars_i(xs_str *str, const char *chars); 78xs_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") 79#define xs_strip_i(str) xs_strip_chars_i(str, " \r\n\t\v\f")
77xs_str *xs_tolower_i(xs_str *str); 80xs_str *xs_tolower_i(xs_str *str);
@@ -424,6 +427,17 @@ xs_str *xs_str_new(const char *str)
424} 427}
425 428
426 429
430xs_str *xs_str_new_sz(const char *mem, int sz)
431/* creates a new string from a memory block, adding an asciiz */
432{
433 xs_str *s = xs_realloc(NULL, _xs_blk_size(sz + 1));
434 memcpy(s, mem, sz);
435 s[sz] = '\0';
436
437 return s;
438}
439
440
427xs_str *xs_str_wrap_i(const char *prefix, xs_str *str, const char *suffix) 441xs_str *xs_str_wrap_i(const char *prefix, xs_str *str, const char *suffix)
428/* wraps str with prefix and suffix */ 442/* wraps str with prefix and suffix */
429{ 443{
@@ -546,26 +560,36 @@ xs_str *xs_crop_i(xs_str *str, int start, int end)
546} 560}
547 561
548 562
549xs_str *xs_strip_chars_i(xs_str *str, const char *chars) 563xs_str *xs_lstrip_chars_i(xs_str *str, const char *chars)
550/* strips the string of chars from the start and the end */ 564/* strips all chars from the start of str */
551{ 565{
552 XS_ASSERT_TYPE(str, XSTYPE_STRING); 566 int n;
553 567
568 for (n = 0; str[n] && strchr(chars, str[n]); n++);
569
570 if (n)
571 str = xs_collapse(str, 0, n);
572
573 return str;
574}
575
576
577xs_str *xs_rstrip_chars_i(xs_str *str, const char *chars)
578/* strips all chars from the end of str */
579{
554 int n; 580 int n;
555 581
556 /* strip first from the end */
557 for (n = strlen(str); n > 0 && strchr(chars, str[n - 1]); n--); 582 for (n = strlen(str); n > 0 && strchr(chars, str[n - 1]); n--);
558 str[n] = '\0'; 583 str[n] = '\0';
559 584
560 if (str[0]) { 585 return str;
561 /* now strip from the beginning */ 586}
562 for (n = 0; str[n] && strchr(chars, str[n]); n++);
563 587
564 if (n)
565 str = xs_collapse(str, 0, n);
566 }
567 588
568 return str; 589xs_str *xs_strip_chars_i(xs_str *str, const char *chars)
590/* strips the string of chars from the start and the end */
591{
592 return xs_lstrip_chars_i(xs_rstrip_chars_i(str, chars), chars);
569} 593}
570 594
571 595
@@ -859,11 +883,9 @@ xs_list *xs_split_n(const char *str, const char *sep, int times)
859 list = xs_list_new(); 883 list = xs_list_new();
860 884
861 while (times > 0 && (ss = strstr(str, sep)) != NULL) { 885 while (times > 0 && (ss = strstr(str, sep)) != NULL) {
862 /* add the first part (without the asciiz) */ 886 /* create a new string with this slice and add it to the list */
863 list = xs_list_append_m(list, str, ss - str); 887 xs *s = xs_str_new_sz(str, ss - str);
864 888 list = xs_list_append(list, s);
865 /* add the asciiz */
866 list = xs_insert_m(list, xs_size(list) - 1, "", 1);
867 889
868 /* skip past the separator */ 890 /* skip past the separator */
869 str = ss + sz; 891 str = ss + sz;
@@ -1131,8 +1153,7 @@ int xs_data_size(const xs_data *value)
1131void xs_data_get(const xs_data *value, void *data) 1153void xs_data_get(const xs_data *value, void *data)
1132/* copies the raw data stored inside value into data */ 1154/* copies the raw data stored inside value into data */
1133{ 1155{
1134 int size = _xs_get_24b(value + 1) - 4; 1156 memcpy(data, &value[4], xs_data_size(value));
1135 memcpy(data, &value[4], size);
1136} 1157}
1137 1158
1138 1159