ucx/string.c

changeset 231
35490eb48214
parent 225
a1a068c2c4ef
child 233
bd58fdde142d
equal deleted inserted replaced
230:4044131874f9 231:35490eb48214
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--) {

mercurial