200 sstr_t* sstrsplit_a(UcxAllocator *allocator, sstr_t s, sstr_t d, ssize_t *n) { |
200 sstr_t* sstrsplit_a(UcxAllocator *allocator, sstr_t s, sstr_t d, ssize_t *n) { |
201 if (s.length == 0 || d.length == 0) { |
201 if (s.length == 0 || d.length == 0) { |
202 *n = -1; |
202 *n = -1; |
203 return NULL; |
203 return NULL; |
204 } |
204 } |
205 |
205 |
|
206 /* special cases: delimiter is at least as large as the string */ |
|
207 if (d.length >= s.length) { |
|
208 /* exact match */ |
|
209 if (sstrcmp(s, d) == 0) { |
|
210 *n = 0; |
|
211 return NULL; |
|
212 } else /* no match possible */ { |
|
213 *n = 1; |
|
214 sstr_t *result = (sstr_t*) almalloc(allocator, sizeof(sstr_t)); |
|
215 result->ptr = (char*) almalloc(allocator, 1+s.length); |
|
216 memcpy(result->ptr, s.ptr, s.length); |
|
217 result->ptr[s.length] = '\0'; |
|
218 result->length = s.length; |
|
219 return result; |
|
220 } |
|
221 } |
|
222 |
206 sstr_t* result; |
223 sstr_t* result; |
207 ssize_t nmax = *n; |
224 ssize_t nmax = *n; |
208 *n = 1; |
225 *n = 1; |
209 |
226 |
210 /* special case: exact match - no processing needed */ |
|
211 if (sstrcmp(s, d) == 0) { |
|
212 *n = 0; |
|
213 return NULL; |
|
214 } |
|
215 sstr_t sv = sstrdup(s); |
227 sstr_t sv = sstrdup(s); |
216 if (sv.length == 0) { |
228 if (sv.length == 0) { |
217 *n = -2; |
229 *n = -2; |
218 return NULL; |
230 return NULL; |
219 } |
231 } |
236 for (ssize_t i = 0 ; i < *n ; i++) { |
248 for (ssize_t i = 0 ; i < *n ; i++) { |
237 size_t l = strlen(pptr); |
249 size_t l = strlen(pptr); |
238 char* ptr = (char*) almalloc(allocator, l + 1); |
250 char* ptr = (char*) almalloc(allocator, l + 1); |
239 if (ptr) { |
251 if (ptr) { |
240 memcpy(ptr, pptr, l); |
252 memcpy(ptr, pptr, l); |
241 ptr[l] = 0; |
253 ptr[l] = '\0'; |
242 |
254 |
243 result[i] = sstrn(ptr, l); |
255 result[i] = sstrn(ptr, l); |
244 pptr += l + d.length; |
256 pptr += l + d.length; |
245 } else { |
257 } else { |
246 for (ssize_t j = i-1 ; j >= 0 ; j--) { |
258 for (ssize_t j = i-1 ; j >= 0 ; j--) { |