7#define STRV(NAME) CSTL_TOKCAT(cstl_STRING, _##NAME)
8#define STRF(NAME, ...) STRV(NAME)(__VA_ARGS__)
9#define STDSTRF(NAME, ...) CSTL_TOKCAT(STDSTRPFX, NAME)(__VA_ARGS__)
12#define cstl_STRING_char_t STRV(char_t)
15const cstl_STRING_char_t STRV(nul) = STRNUL;
18static inline cstl_STRING_char_t * STRF(
21 return STRF(data, s) + i;
24cstl_STRING_char_t * STRF(at,
struct cstl_STRING *
const s,
const size_t i)
26 if (i >= STRF(size, s)) {
30 return STRF(__at, s, i);
33const cstl_STRING_char_t * STRF(
34 at_const,
const struct cstl_STRING *
const s,
const size_t i)
39const cstl_STRING_char_t * STRF(str,
const struct cstl_STRING *
const s)
41 const cstl_STRING_char_t * str = STRF(data, (
struct cstl_STRING *)s);
49static void STRF(__resize,
struct cstl_STRING *
const s,
const size_t n)
52 *STRF(__at, s, n) = STRV(nul);
55void STRF(resize,
struct cstl_STRING *
const s,
const size_t n)
57 size_t sz = STRF(size, s);
60 *STRF(__at, s, sz++) = STRV(nul);
65static void STRF(prep_insert,
69 if (pos > STRF(size, s)) {
74 const size_t size = STRF(size, s);
75 STRF(__resize, s, size + len);
76 memmove(STRF(__at, s, pos + len),
78 (size - pos) *
sizeof(cstl_STRING_char_t));
84 size_t cnt,
const cstl_STRING_char_t ch)
86 STRF(prep_insert, s, idx, cnt);
88 *STRF(__at, s, idx++) = ch;
92void STRF(insert_str_n,
94 const cstl_STRING_char_t *
const str,
const size_t len)
96 STRF(prep_insert, s, idx, len);
97 memcpy(STRF(__at, s, idx), str, len *
sizeof(cstl_STRING_char_t));
102 const cstl_STRING_char_t c,
const size_t pos)
104 const cstl_STRING_char_t *
const str = STRF(str, s);
105 const size_t sz = STRF(size, s);
107 const cstl_STRING_char_t * f;
115 f = STDSTRF(chr, str + pos, c);
116 if (f != NULL && f != str + sz) {
117 i = ((uintptr_t)f - (uintptr_t)str) /
sizeof(cstl_STRING_char_t);
123ssize_t STRF(find_str,
125 const cstl_STRING_char_t *
const n,
const size_t pos)
127 const cstl_STRING_char_t *
const str = STRF(str, h);
129 const cstl_STRING_char_t * f;
132 if (pos >= STRF(size, h)) {
137 f = STDSTRF(str, str + pos, n);
139 i = ((uintptr_t)f - (uintptr_t)str) /
sizeof(cstl_STRING_char_t);
146static void STRF(substr_prep,
148 const size_t pos,
size_t *
const len)
150 const size_t size = STRF(size, s);
156 if (pos + *len > size) {
163 const size_t idx,
size_t len,
166 STRF(substr_prep, s, idx, &len);
167 STRF(__resize, sub, len);
168 memcpy(STRF(__at, sub, 0),
170 len *
sizeof(cstl_STRING_char_t));
173void STRF(erase,
struct cstl_STRING *
const s,
const size_t idx,
size_t len)
175 const size_t size = STRF(size, s);
176 STRF(substr_prep, s, idx, &len);
177 memmove(STRF(__at, s, idx),
178 STRF(__at, s, idx + len),
179 (size - (idx + len)) *
sizeof(cstl_STRING_char_t));
180 STRF(__resize, s, size - len);
183#undef cstl_STRING_char_t
void cstl_vector_resize(struct cstl_vector *v, size_t sz)
Change the number of valid elements in the vector.