commit 25a8355

default  ·  2023-08-13 13:41:58 +0000 UTC
parent 8d04fc9
Backport from xs.
2 files changed,  +36, -33
M xs.h
M xs.h
+35, -32
  1@@ -71,9 +71,9 @@ xs_str *xs_replace_in(xs_str *str, const char *sfrom, const char *sto, int times
  2 #define xs_replace_n(str, sfrom, sto, times) xs_replace_in(xs_dup(str), sfrom, sto, times)
  3 xs_str *xs_fmt(const char *fmt, ...);
  4 int xs_str_in(const char *haystack, const char *needle);
  5-int _xs_startsorends(const char *str, const char *xfix, int ends);
  6-#define xs_startswith(str, prefix) _xs_startsorends(str, prefix, 0)
  7-#define xs_endswith(str, postfix) _xs_startsorends(str, postfix, 1)
  8+int xs_starts_and_ends(const char *prefix, const char *str, const char *suffix);
  9+#define xs_startswith(str, prefix) xs_starts_and_ends(prefix, str, NULL)
 10+#define xs_endswith(str, suffix) xs_starts_and_ends(NULL, str, suffix)
 11 xs_str *xs_crop_i(xs_str *str, int start, int end);
 12 xs_str *xs_strip_chars_i(xs_str *str, const char *chars);
 13 #define xs_strip_i(str) xs_strip_chars_i(str, " \r\n\t\v\f")
 14@@ -436,7 +436,7 @@ xs_str *xs_str_wrap_i(const char *prefix, xs_str *str, const char *suffix)
 15         str = xs_insert_m(str, 0, prefix, strlen(prefix));
 16 
 17     if (suffix)
 18-        str = xs_insert_m(str, xs_size(str) - 1, suffix, xs_size(suffix));
 19+        str = xs_insert_m(str, strlen(str), suffix, strlen(suffix));
 20 
 21     return str;
 22 }
 23@@ -455,8 +455,11 @@ xs_str *xs_replace_in(xs_str *str, const char *sfrom, const char *sto, int times
 24     while (times > 0 && (ss = strstr(str + offset, sfrom)) != NULL) {
 25         int n_offset = ss - str;
 26 
 27-        str = xs_collapse(str, n_offset, sfsz);
 28-        str = xs_expand(str, n_offset, stsz);
 29+        if (sfsz != stsz) {
 30+            str = xs_collapse(str, n_offset, sfsz);
 31+            str = xs_expand(str, n_offset, stsz);
 32+        }
 33+
 34         memcpy(str + n_offset, sto, stsz);
 35 
 36         offset = n_offset + stsz;
 37@@ -504,13 +507,23 @@ int xs_str_in(const char *haystack, const char *needle)
 38 }
 39 
 40 
 41-int _xs_startsorends(const char *str, const char *xfix, int ends)
 42-/* returns true if str starts or ends with xfix */
 43+int xs_starts_and_ends(const char *prefix, const char *str, const char *suffix)
 44+/* returns true if str starts with prefix and ends with suffix */
 45 {
 46-    int ssz = strlen(str);
 47-    int psz = strlen(xfix);
 48+    int sz = strlen(str);
 49+    int psz = prefix ? strlen(prefix) : 0;
 50+    int ssz = suffix ? strlen(suffix) : 0;
 51+
 52+    if (sz < psz || sz < ssz)
 53+        return 0;
 54 
 55-    return !!(ssz >= psz && memcmp(xfix, str + (ends ? ssz - psz : 0), psz) == 0);
 56+    if (prefix && memcmp(str, prefix, psz) != 0)
 57+        return 0;
 58+
 59+    if (suffix && memcmp(str + sz - ssz, suffix, ssz) != 0)
 60+        return 0;
 61+
 62+    return 1;
 63 }
 64 
 65 
 66@@ -576,15 +589,10 @@ xs_str *xs_tolower_i(xs_str *str)
 67 xs_list *xs_list_new(void)
 68 /* creates a new list */
 69 {
 70-    xs_list *list;
 71-
 72-    list = xs_realloc(NULL, _xs_blk_size(5));
 73-    list[0] = XSTYPE_LIST;
 74-    list[4] = XSTYPE_EOM;
 75-
 76-    _xs_put_24b(list + 1, 5);
 77-
 78-    return list;
 79+    return memcpy(
 80+        xs_realloc(NULL, _xs_blk_size(sizeof(xs_stock_list))),
 81+        xs_stock_list, sizeof(xs_stock_list)
 82+    );
 83 }
 84 
 85 
 86@@ -593,10 +601,10 @@ xs_list *_xs_list_write_litem(xs_list *list, int offset, const char *mem, int ds
 87 {
 88     XS_ASSERT_TYPE(list, XSTYPE_LIST);
 89 
 90-    char c = XSTYPE_LITEM;
 91+    list = xs_expand(list, offset, dsz + 1);
 92 
 93-    list = xs_insert_m(list, offset,     &c,  1);
 94-    list = xs_insert_m(list, offset + 1, mem, dsz);
 95+    list[offset] = XSTYPE_LITEM;
 96+    memcpy(list + offset + 1, mem, dsz);
 97 
 98     return list;
 99 }
100@@ -882,15 +890,10 @@ xs_list *xs_list_cat(xs_list *l1, const xs_list *l2)
101 xs_dict *xs_dict_new(void)
102 /* creates a new dict */
103 {
104-    xs_dict *dict;
105-
106-    dict = xs_realloc(NULL, _xs_blk_size(5));
107-    dict[0] = XSTYPE_DICT;
108-    dict[4] = XSTYPE_EOM;
109-
110-    _xs_put_24b(dict + 1, 5);
111-
112-    return dict;
113+    return memcpy(
114+        xs_realloc(NULL, _xs_blk_size(sizeof(xs_stock_dict))),
115+        xs_stock_dict, sizeof(xs_stock_dict)
116+    );
117 }
118 
119 
+1, -1
1@@ -1 +1 @@
2-/* ac9e4d062c08ebfec62279b7ffde5215d45fcea6 */
3+/* 0efaa0cfce82c0f8f7bde81359a2c55a41928af3 */