210 *n = 0; |
210 *n = 0; |
211 return NULL; |
211 return NULL; |
212 } else /* no match possible */ { |
212 } else /* no match possible */ { |
213 *n = 1; |
213 *n = 1; |
214 sstr_t *result = (sstr_t*) almalloc(allocator, sizeof(sstr_t)); |
214 sstr_t *result = (sstr_t*) almalloc(allocator, sizeof(sstr_t)); |
215 result->ptr = (char*) almalloc(allocator, 1+s.length); |
215 *result = sstrdup_a(allocator, s); |
216 memcpy(result->ptr, s.ptr, s.length); |
|
217 result->ptr[s.length] = '\0'; |
|
218 result->length = s.length; |
|
219 return result; |
216 return result; |
220 } |
217 } |
221 } |
218 } |
222 |
219 |
223 sstr_t* result; |
|
224 ssize_t nmax = *n; |
220 ssize_t nmax = *n; |
225 *n = 1; |
221 sstr_t* result = (sstr_t*) almalloc(allocator, sizeof(sstr_t)); |
226 |
|
227 sstr_t sv = sstrdup(s); |
|
228 if (sv.length == 0) { |
|
229 *n = -2; |
|
230 return NULL; |
|
231 } |
|
232 |
|
233 for (size_t i = 0 ; i < s.length ; i++) { |
|
234 sstr_t substr = sstrsubs(sv, i); |
|
235 if (sstrprefix(substr, d)) { |
|
236 (*n)++; |
|
237 for (size_t j = 0 ; j < d.length ; j++) { |
|
238 sv.ptr[i+j] = 0; |
|
239 } |
|
240 i += d.length - 1; // -1, because the loop will do a i++ |
|
241 } |
|
242 if ((*n) == nmax) break; |
|
243 } |
|
244 result = (sstr_t*) almalloc(allocator, sizeof(sstr_t)*(*n)); |
|
245 |
222 |
246 if (result) { |
223 if (result) { |
247 char *pptr = sv.ptr; |
224 sstr_t curpos = s; |
248 for (ssize_t i = 0 ; i < *n ; i++) { |
225 ssize_t j = 1; |
249 size_t l = strlen(pptr); |
226 while (1) { |
250 char* ptr = (char*) almalloc(allocator, l + 1); |
227 sstr_t match = sstrstr(curpos, d); |
251 if (ptr) { |
228 if (match.length > 0) { |
252 memcpy(ptr, pptr, l); |
229 /* is this our last try? */ |
253 ptr[l] = '\0'; |
230 if (nmax == 0 || j < nmax) { |
254 |
231 /* copy the current string to the array */ |
255 result[i] = sstrn(ptr, l); |
232 sstr_t item = sstrn(curpos.ptr, match.ptr - curpos.ptr); |
256 pptr += l + d.length; |
233 result[j-1] = sstrdup_a(allocator, item); |
|
234 size_t processed = item.length + d.length; |
|
235 curpos.ptr += processed; |
|
236 curpos.length -= processed; |
|
237 |
|
238 /* allocate memory for the next string */ |
|
239 j++; |
|
240 sstr_t* reallocated = (sstr_t*) |
|
241 alrealloc(allocator, result, j*sizeof(sstr_t)); |
|
242 if (reallocated) { |
|
243 result = reallocated; |
|
244 } else { |
|
245 for (ssize_t i = 0 ; i < j-1 ; i++) { |
|
246 alfree(allocator, result[i].ptr); |
|
247 } |
|
248 alfree(allocator, result); |
|
249 *n = -2; |
|
250 return NULL; |
|
251 } |
|
252 } else { |
|
253 /* nmax reached, copy the _full_ remaining string */ |
|
254 result[j-1] = sstrdup_a(allocator, curpos); |
|
255 break; |
|
256 } |
257 } else { |
257 } else { |
258 for (ssize_t j = i-1 ; j >= 0 ; j--) { |
258 /* no more matches, copy last string */ |
259 alfree(allocator, result[j].ptr); |
259 result[j-1] = sstrdup_a(allocator, curpos); |
260 } |
|
261 alfree(allocator, result); |
|
262 *n = -2; |
|
263 break; |
260 break; |
264 } |
261 } |
265 } |
262 } |
|
263 *n = j; |
266 } else { |
264 } else { |
267 *n = -2; |
265 *n = -2; |
268 } |
266 } |
269 |
|
270 free(sv.ptr); |
|
271 |
267 |
272 return result; |
268 return result; |
273 } |
269 } |
274 |
270 |
275 int sstrcmp(sstr_t s1, sstr_t s2) { |
271 int sstrcmp(sstr_t s1, sstr_t s2) { |