libcstl
Loading...
Searching...
No Matches
_string.c
Go to the documentation of this file.
1/*!
2 * @file
3 */
4
5#include "cstl/common.h"
6
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__)
10
11#ifndef NO_DOC
12#define cstl_STRING_char_t STRV(char_t)
13#endif
14
15const cstl_STRING_char_t STRV(nul) = STRNUL;
16
17/*! @private */
18static inline cstl_STRING_char_t * STRF(
19 __at, struct cstl_STRING * const s, const size_t i)
20{
21 return STRF(data, s) + i;
22}
23
24cstl_STRING_char_t * STRF(at, struct cstl_STRING * const s, const size_t i)
25{
26 if (i >= STRF(size, s)) {
27 abort();
28 }
29
30 return STRF(__at, s, i);
31}
32
33const cstl_STRING_char_t * STRF(
34 at_const, const struct cstl_STRING * const s, const size_t i)
35{
36 return STRF(at, (struct cstl_STRING *)s, i);
37}
38
39const cstl_STRING_char_t * STRF(str, const struct cstl_STRING * const s)
40{
41 const cstl_STRING_char_t * str = STRF(data, (struct cstl_STRING *)s);
42 if (str == NULL) {
43 str = &STRV(nul);
44 }
45 return str;
46}
47
48/*! @private */
49static void STRF(__resize, struct cstl_STRING * const s, const size_t n)
50{
51 cstl_vector_resize(&s->v, n + 1);
52 *STRF(__at, s, n) = STRV(nul);
53}
54
55void STRF(resize, struct cstl_STRING * const s, const size_t n)
56{
57 size_t sz = STRF(size, s);
58 STRF(__resize, s, n);
59 while (sz < n) {
60 *STRF(__at, s, sz++) = STRV(nul);
61 }
62}
63
64/*! @private */
65static void STRF(prep_insert,
66 struct cstl_STRING * const s, const size_t pos,
67 const size_t len)
68{
69 if (pos > STRF(size, s)) {
70 abort();
71 }
72
73 if (len > 0) {
74 const size_t size = STRF(size, s);
75 STRF(__resize, s, size + len);
76 memmove(STRF(__at, s, pos + len),
77 STRF(__at, s, pos),
78 (size - pos) * sizeof(cstl_STRING_char_t));
79 }
80}
81
82void STRF(insert_ch,
83 struct cstl_STRING * const s, size_t idx,
84 size_t cnt, const cstl_STRING_char_t ch)
85{
86 STRF(prep_insert, s, idx, cnt);
87 while (cnt-- > 0) {
88 *STRF(__at, s, idx++) = ch;
89 }
90}
91
92void STRF(insert_str_n,
93 struct cstl_STRING * const s, const size_t idx,
94 const cstl_STRING_char_t * const str, const size_t len)
95{
96 STRF(prep_insert, s, idx, len);
97 memcpy(STRF(__at, s, idx), str, len * sizeof(cstl_STRING_char_t));
98}
99
100ssize_t STRF(find_ch,
101 const struct cstl_STRING * const s,
102 const cstl_STRING_char_t c, const size_t pos)
103{
104 const cstl_STRING_char_t * const str = STRF(str, s);
105 const size_t sz = STRF(size, s);
106
107 const cstl_STRING_char_t * f;
108 ssize_t i;
109
110 if (pos >= sz) {
111 abort();
112 }
113
114 i = -1;
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);
118 }
119
120 return i;
121}
122
123ssize_t STRF(find_str,
124 const struct cstl_STRING * const h,
125 const cstl_STRING_char_t * const n, const size_t pos)
126{
127 const cstl_STRING_char_t * const str = STRF(str, h);
128
129 const cstl_STRING_char_t * f;
130 ssize_t i;
131
132 if (pos >= STRF(size, h)) {
133 abort();
134 }
135
136 i = -1;
137 f = STDSTRF(str, str + pos, n);
138 if (f != NULL) {
139 i = ((uintptr_t)f - (uintptr_t)str) / sizeof(cstl_STRING_char_t);
140 }
141
142 return i;
143}
144
145/*! @private */
146static void STRF(substr_prep,
147 const struct cstl_STRING * const s,
148 const size_t pos, size_t * const len)
149{
150 const size_t size = STRF(size, s);
151
152 if (pos >= size) {
153 abort();
154 }
155
156 if (pos + *len > size) {
157 *len = size - pos;
158 }
159}
160
161void STRF(substr,
162 const struct cstl_STRING * const s,
163 const size_t idx, size_t len,
164 struct cstl_STRING * const sub)
165{
166 STRF(substr_prep, s, idx, &len);
167 STRF(__resize, sub, len);
168 memcpy(STRF(__at, sub, 0),
169 STRF(__at, (struct cstl_STRING *)s, idx),
170 len * sizeof(cstl_STRING_char_t));
171}
172
173void STRF(erase, struct cstl_STRING * const s, const size_t idx, size_t len)
174{
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);
181}
182
183#undef cstl_STRING_char_t
184
185#undef STDSTRF
186#undef STRF
187#undef STRV
void cstl_vector_resize(struct cstl_vector *v, size_t sz)
Change the number of valid elements in the vector.
Definition vector.c:73
A string object.
Definition _string.h:64