summaryrefslogtreecommitdiff
path: root/xs.h
diff options
context:
space:
mode:
authorGravatar default2023-08-13 15:41:58 +0200
committerGravatar default2023-08-13 15:41:58 +0200
commit25a8355be31814bf4d2b5470e599d8889254f2be (patch)
treece0ac9154cd6cd4a435a6dbd7cdd62e3d9dc9978 /xs.h
parentBackport from xs. (diff)
downloadpenes-snac2-25a8355be31814bf4d2b5470e599d8889254f2be.tar.gz
penes-snac2-25a8355be31814bf4d2b5470e599d8889254f2be.tar.xz
penes-snac2-25a8355be31814bf4d2b5470e599d8889254f2be.zip
Backport from xs.
Diffstat (limited to 'xs.h')
-rw-r--r--xs.h67
1 files changed, 35 insertions, 32 deletions
diff --git a/xs.h b/xs.h
index 4cda1c9..1f714b6 100644
--- a/xs.h
+++ b/xs.h
@@ -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)
72xs_str *xs_fmt(const char *fmt, ...); 72xs_str *xs_fmt(const char *fmt, ...);
73int xs_str_in(const char *haystack, const char *needle); 73int xs_str_in(const char *haystack, const char *needle);
74int _xs_startsorends(const char *str, const char *xfix, int ends); 74int 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)
77xs_str *xs_crop_i(xs_str *str, int start, int end); 77xs_str *xs_crop_i(xs_str *str, int start, int end);
78xs_str *xs_strip_chars_i(xs_str *str, const char *chars); 78xs_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
507int _xs_startsorends(const char *str, const char *xfix, int ends) 510int 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)
576xs_list *xs_list_new(void) 589xs_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)
882xs_dict *xs_dict_new(void) 890xs_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