95 } |
95 } |
96 |
96 |
97 sstr_t sstrsubsl(sstr_t s, size_t start, size_t length) { |
97 sstr_t sstrsubsl(sstr_t s, size_t start, size_t length) { |
98 sstr_t new_sstr; |
98 sstr_t new_sstr; |
99 if (start >= s.length) { |
99 if (start >= s.length) { |
100 return s; |
100 new_sstr.ptr = NULL; |
101 } |
101 new_sstr.length = 0; |
102 if (length > s.length-start) { |
102 } else { |
103 length = s.length-start; |
103 if (length > s.length-start) { |
104 } |
104 length = s.length-start; |
105 new_sstr.ptr = &s.ptr[start]; |
105 } |
106 new_sstr.length = length; |
106 new_sstr.ptr = &s.ptr[start]; |
|
107 new_sstr.length = length; |
|
108 } |
107 return new_sstr; |
109 return new_sstr; |
108 } |
110 } |
109 |
111 |
110 sstr_t sstrchr(sstr_t s, int c) { |
112 sstr_t sstrchr(sstr_t s, int c) { |
111 for(size_t i=0;i<s.length;i++) { |
113 for(size_t i=0;i<s.length;i++) { |
131 n.ptr = NULL; |
133 n.ptr = NULL; |
132 n.length = 0; |
134 n.length = 0; |
133 return n; |
135 return n; |
134 } |
136 } |
135 |
137 |
136 sstr_t* sstrsplit(sstr_t s, sstr_t d, size_t *n) { |
138 sstr_t* sstrsplit(sstr_t s, sstr_t d, ssize_t *n) { |
137 return sstrsplit_a(ucx_default_allocator(), s, d, n); |
139 return sstrsplit_a(ucx_default_allocator(), s, d, n); |
138 } |
140 } |
139 |
141 |
140 sstr_t* sstrsplit_a(UcxAllocator *allocator, sstr_t s, sstr_t d, size_t *n) { |
142 sstr_t* sstrsplit_a(UcxAllocator *allocator, sstr_t s, sstr_t d, ssize_t *n) { |
141 if (s.length == 0 || d.length == 0) { |
143 if (s.length == 0 || d.length == 0) { |
142 *n = -1; |
144 *n = -1; |
143 return NULL; |
145 return NULL; |
144 } |
146 } |
145 |
147 |
146 sstr_t* result; |
148 sstr_t* result; |
147 size_t nmax = *n; |
149 ssize_t nmax = *n; |
148 *n = 1; |
150 *n = 1; |
149 |
151 |
150 /* special case: exact match - no processing needed */ |
152 /* special case: exact match - no processing needed */ |
151 if (sstrcmp(s, d) == 0) { |
153 if (sstrcmp(s, d) == 0) { |
152 *n = 0; |
154 *n = 0; |
177 i += d.length; |
179 i += d.length; |
178 } |
180 } |
179 } |
181 } |
180 if ((*n) == nmax) break; |
182 if ((*n) == nmax) break; |
181 } |
183 } |
182 result = (sstr_t*) allocator->malloc(allocator->pool, sizeof(sstr_t)*(*n)); |
184 result = (sstr_t*) almalloc(allocator, sizeof(sstr_t)*(*n)); |
183 |
185 |
184 if (result) { |
186 if (result) { |
185 char *pptr = sv.ptr; |
187 char *pptr = sv.ptr; |
186 for (size_t i = 0 ; i < *n ; i++) { |
188 for (ssize_t i = 0 ; i < *n ; i++) { |
187 size_t l = strlen(pptr); |
189 size_t l = strlen(pptr); |
188 char* ptr = (char*) allocator->malloc(allocator->pool, l + 1); |
190 char* ptr = (char*) almalloc(allocator, l + 1); |
189 memcpy(ptr, pptr, l); |
191 if (ptr) { |
190 ptr[l] = 0; |
192 memcpy(ptr, pptr, l); |
191 |
193 ptr[l] = 0; |
192 result[i] = sstrn(ptr, l); |
194 |
193 pptr += l + d.length; |
195 result[i] = sstrn(ptr, l); |
|
196 pptr += l + d.length; |
|
197 } else { |
|
198 for (ssize_t j = i-1 ; j >= 0 ; j--) { |
|
199 alfree(allocator, result[j].ptr); |
|
200 } |
|
201 alfree(allocator, result); |
|
202 *n = -2; |
|
203 break; |
|
204 } |
194 } |
205 } |
195 } else { |
206 } else { |
196 *n = -2; |
207 *n = -2; |
197 } |
208 } |
198 |
209 |
229 return sstrdup_a(ucx_default_allocator(), s); |
240 return sstrdup_a(ucx_default_allocator(), s); |
230 } |
241 } |
231 |
242 |
232 sstr_t sstrdup_a(UcxAllocator *allocator, sstr_t s) { |
243 sstr_t sstrdup_a(UcxAllocator *allocator, sstr_t s) { |
233 sstr_t newstring; |
244 sstr_t newstring; |
234 newstring.ptr = (char*)allocator->malloc(allocator->pool, s.length + 1); |
245 newstring.ptr = (char*)almalloc(allocator, s.length + 1); |
235 if (newstring.ptr) { |
246 if (newstring.ptr) { |
236 newstring.length = s.length; |
247 newstring.length = s.length; |
237 newstring.ptr[newstring.length] = 0; |
248 newstring.ptr[newstring.length] = 0; |
238 |
249 |
239 memcpy(newstring.ptr, s.ptr, s.length); |
250 memcpy(newstring.ptr, s.ptr, s.length); |