diff options
| author | 2023-08-13 15:41:58 +0200 | |
|---|---|---|
| committer | 2023-08-13 15:41:58 +0200 | |
| commit | 25a8355be31814bf4d2b5470e599d8889254f2be (patch) | |
| tree | ce0ac9154cd6cd4a435a6dbd7cdd62e3d9dc9978 | |
| parent | Backport from xs. (diff) | |
| download | snac2-25a8355be31814bf4d2b5470e599d8889254f2be.tar.gz snac2-25a8355be31814bf4d2b5470e599d8889254f2be.tar.xz snac2-25a8355be31814bf4d2b5470e599d8889254f2be.zip | |
Backport from xs.
Diffstat (limited to '')
| -rw-r--r-- | xs.h | 67 | ||||
| -rw-r--r-- | xs_version.h | 2 |
2 files changed, 36 insertions, 33 deletions
| @@ -71,9 +71,9 @@ xs_str *xs_replace_in(xs_str *str, const char *sfrom, const char *sto, int times | |||
| 71 | #define xs_replace_n(str, sfrom, sto, times) xs_replace_in(xs_dup(str), sfrom, sto, times) | 71 | #define xs_replace_n(str, sfrom, sto, times) xs_replace_in(xs_dup(str), sfrom, sto, times) |
| 72 | xs_str *xs_fmt(const char *fmt, ...); | 72 | xs_str *xs_fmt(const char *fmt, ...); |
| 73 | int xs_str_in(const char *haystack, const char *needle); | 73 | int xs_str_in(const char *haystack, const char *needle); |
| 74 | int _xs_startsorends(const char *str, const char *xfix, int ends); | 74 | int xs_starts_and_ends(const char *prefix, const char *str, const char *suffix); |
| 75 | #define xs_startswith(str, prefix) _xs_startsorends(str, prefix, 0) | 75 | #define xs_startswith(str, prefix) xs_starts_and_ends(prefix, str, NULL) |
| 76 | #define xs_endswith(str, postfix) _xs_startsorends(str, postfix, 1) | 76 | #define xs_endswith(str, suffix) xs_starts_and_ends(NULL, str, suffix) |
| 77 | xs_str *xs_crop_i(xs_str *str, int start, int end); | 77 | xs_str *xs_crop_i(xs_str *str, int start, int end); |
| 78 | xs_str *xs_strip_chars_i(xs_str *str, const char *chars); | 78 | xs_str *xs_strip_chars_i(xs_str *str, const char *chars); |
| 79 | #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") |
| @@ -436,7 +436,7 @@ xs_str *xs_str_wrap_i(const char *prefix, xs_str *str, const char *suffix) | |||
| 436 | str = xs_insert_m(str, 0, prefix, strlen(prefix)); | 436 | str = xs_insert_m(str, 0, prefix, strlen(prefix)); |
| 437 | 437 | ||
| 438 | if (suffix) | 438 | if (suffix) |
| 439 | str = xs_insert_m(str, xs_size(str) - 1, suffix, xs_size(suffix)); | 439 | str = xs_insert_m(str, strlen(str), suffix, strlen(suffix)); |
| 440 | 440 | ||
| 441 | return str; | 441 | return str; |
| 442 | } | 442 | } |
| @@ -455,8 +455,11 @@ xs_str *xs_replace_in(xs_str *str, const char *sfrom, const char *sto, int times | |||
| 455 | while (times > 0 && (ss = strstr(str + offset, sfrom)) != NULL) { | 455 | while (times > 0 && (ss = strstr(str + offset, sfrom)) != NULL) { |
| 456 | int n_offset = ss - str; | 456 | int n_offset = ss - str; |
| 457 | 457 | ||
| 458 | str = xs_collapse(str, n_offset, sfsz); | 458 | if (sfsz != stsz) { |
| 459 | str = xs_expand(str, n_offset, stsz); | 459 | str = xs_collapse(str, n_offset, sfsz); |
| 460 | str = xs_expand(str, n_offset, stsz); | ||
| 461 | } | ||
| 462 | |||
| 460 | memcpy(str + n_offset, sto, stsz); | 463 | memcpy(str + n_offset, sto, stsz); |
| 461 | 464 | ||
| 462 | offset = n_offset + stsz; | 465 | offset = n_offset + stsz; |
| @@ -504,13 +507,23 @@ int xs_str_in(const char *haystack, const char *needle) | |||
| 504 | } | 507 | } |
| 505 | 508 | ||
| 506 | 509 | ||
| 507 | int _xs_startsorends(const char *str, const char *xfix, int ends) | 510 | int xs_starts_and_ends(const char *prefix, const char *str, const char *suffix) |
| 508 | /* returns true if str starts or ends with xfix */ | 511 | /* returns true if str starts with prefix and ends with suffix */ |
| 509 | { | 512 | { |
| 510 | int ssz = strlen(str); | 513 | int sz = strlen(str); |
| 511 | int psz = strlen(xfix); | 514 | int psz = prefix ? strlen(prefix) : 0; |
| 515 | int ssz = suffix ? strlen(suffix) : 0; | ||
| 516 | |||
| 517 | if (sz < psz || sz < ssz) | ||
| 518 | return 0; | ||
| 512 | 519 | ||
| 513 | return !!(ssz >= psz && memcmp(xfix, str + (ends ? ssz - psz : 0), psz) == 0); | 520 | if (prefix && memcmp(str, prefix, psz) != 0) |
| 521 | return 0; | ||
| 522 | |||
| 523 | if (suffix && memcmp(str + sz - ssz, suffix, ssz) != 0) | ||
| 524 | return 0; | ||
| 525 | |||
| 526 | return 1; | ||
| 514 | } | 527 | } |
| 515 | 528 | ||
| 516 | 529 | ||
| @@ -576,15 +589,10 @@ xs_str *xs_tolower_i(xs_str *str) | |||
| 576 | xs_list *xs_list_new(void) | 589 | xs_list *xs_list_new(void) |
| 577 | /* creates a new list */ | 590 | /* creates a new list */ |
| 578 | { | 591 | { |
| 579 | xs_list *list; | 592 | return memcpy( |
| 580 | 593 | xs_realloc(NULL, _xs_blk_size(sizeof(xs_stock_list))), | |
| 581 | list = xs_realloc(NULL, _xs_blk_size(5)); | 594 | xs_stock_list, sizeof(xs_stock_list) |
| 582 | list[0] = XSTYPE_LIST; | 595 | ); |
| 583 | list[4] = XSTYPE_EOM; | ||
| 584 | |||
| 585 | _xs_put_24b(list + 1, 5); | ||
| 586 | |||
| 587 | return list; | ||
| 588 | } | 596 | } |
| 589 | 597 | ||
| 590 | 598 | ||
| @@ -593,10 +601,10 @@ xs_list *_xs_list_write_litem(xs_list *list, int offset, const char *mem, int ds | |||
| 593 | { | 601 | { |
| 594 | XS_ASSERT_TYPE(list, XSTYPE_LIST); | 602 | XS_ASSERT_TYPE(list, XSTYPE_LIST); |
| 595 | 603 | ||
| 596 | char c = XSTYPE_LITEM; | 604 | list = xs_expand(list, offset, dsz + 1); |
| 597 | 605 | ||
| 598 | list = xs_insert_m(list, offset, &c, 1); | 606 | list[offset] = XSTYPE_LITEM; |
| 599 | list = xs_insert_m(list, offset + 1, mem, dsz); | 607 | memcpy(list + offset + 1, mem, dsz); |
| 600 | 608 | ||
| 601 | return list; | 609 | return list; |
| 602 | } | 610 | } |
| @@ -882,15 +890,10 @@ xs_list *xs_list_cat(xs_list *l1, const xs_list *l2) | |||
| 882 | xs_dict *xs_dict_new(void) | 890 | xs_dict *xs_dict_new(void) |
| 883 | /* creates a new dict */ | 891 | /* creates a new dict */ |
| 884 | { | 892 | { |
| 885 | xs_dict *dict; | 893 | return memcpy( |
| 886 | 894 | xs_realloc(NULL, _xs_blk_size(sizeof(xs_stock_dict))), | |
| 887 | dict = xs_realloc(NULL, _xs_blk_size(5)); | 895 | xs_stock_dict, sizeof(xs_stock_dict) |
| 888 | dict[0] = XSTYPE_DICT; | 896 | ); |
| 889 | dict[4] = XSTYPE_EOM; | ||
| 890 | |||
| 891 | _xs_put_24b(dict + 1, 5); | ||
| 892 | |||
| 893 | return dict; | ||
| 894 | } | 897 | } |
| 895 | 898 | ||
| 896 | 899 | ||
diff --git a/xs_version.h b/xs_version.h index ac8fedd..d4753e2 100644 --- a/xs_version.h +++ b/xs_version.h | |||
| @@ -1 +1 @@ | |||
| /* ac9e4d062c08ebfec62279b7ffde5215d45fcea6 */ | /* 0efaa0cfce82c0f8f7bde81359a2c55a41928af3 */ | ||