ucx/string.c

changeset 173
31a8682fffb7
parent 152
3238f65db163
child 177
11ad03783baf
equal deleted inserted replaced
172:7084e8e8433c 173:31a8682fffb7
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);

mercurial