164 sstr_t s = sstrvcat_a(a, count, s1, ap); |
164 sstr_t s = sstrvcat_a(a, count, s1, ap); |
165 va_end(ap); |
165 va_end(ap); |
166 return s; |
166 return s; |
167 } |
167 } |
168 |
168 |
|
169 static int ucx_substring( |
|
170 size_t str_length, |
|
171 size_t start, |
|
172 size_t length, |
|
173 size_t *newlen, |
|
174 size_t *newpos) |
|
175 { |
|
176 *newlen = 0; |
|
177 *newpos = 0; |
|
178 |
|
179 if(start > str_length) { |
|
180 return 0; |
|
181 } |
|
182 |
|
183 if(length > str_length - start) { |
|
184 length = str_length - start; |
|
185 } |
|
186 *newlen = length; |
|
187 *newpos = start; |
|
188 return 1; |
|
189 } |
|
190 |
169 sstr_t sstrsubs(sstr_t s, size_t start) { |
191 sstr_t sstrsubs(sstr_t s, size_t start) { |
170 return sstrsubsl (s, start, s.length-start); |
192 return sstrsubsl (s, start, s.length-start); |
171 } |
193 } |
172 |
194 |
173 sstr_t sstrsubsl(sstr_t s, size_t start, size_t length) { |
195 sstr_t sstrsubsl(sstr_t s, size_t start, size_t length) { |
174 sstr_t new_sstr; |
196 size_t pos; |
175 if (start >= s.length) { |
197 sstr_t ret = { NULL, 0 }; |
176 new_sstr.ptr = NULL; |
198 if(ucx_substring(s.length, start, length, &ret.length, &pos)) { |
177 new_sstr.length = 0; |
199 ret.ptr = s.ptr + pos; |
178 } else { |
200 } |
179 if (length > s.length-start) { |
201 return ret; |
180 length = s.length-start; |
202 } |
181 } |
203 |
182 new_sstr.ptr = &s.ptr[start]; |
204 scstr_t scstrsubs(scstr_t s, size_t start) { |
183 new_sstr.length = length; |
205 return scstrsubsl (s, start, s.length-start); |
184 } |
206 } |
185 return new_sstr; |
207 |
|
208 scstr_t scstrsubsl(scstr_t s, size_t start, size_t length) { |
|
209 size_t pos; |
|
210 scstr_t ret = { NULL, 0 }; |
|
211 if(ucx_substring(s.length, start, length, &ret.length, &pos)) { |
|
212 ret.ptr = s.ptr + pos; |
|
213 } |
|
214 return ret; |
|
215 } |
|
216 |
|
217 |
|
218 int ucx_strchr(const char *string, size_t length, int chr, size_t *pos) { |
|
219 for(size_t i=0;i<length;i++) { |
|
220 if(string[i] == chr) { |
|
221 *pos = i; |
|
222 return 1; |
|
223 } |
|
224 } |
|
225 return 0; |
|
226 } |
|
227 |
|
228 int ucx_strrchr(const char *string, size_t length, int chr, size_t *pos) { |
|
229 if(length > 0) { |
|
230 for(size_t i=length-1;i>=0;i--) { |
|
231 if(string[i] == chr) { |
|
232 *pos = i; |
|
233 return 1; |
|
234 } |
|
235 } |
|
236 } |
|
237 return 0; |
186 } |
238 } |
187 |
239 |
188 sstr_t sstrchr(sstr_t s, int c) { |
240 sstr_t sstrchr(sstr_t s, int c) { |
189 for(size_t i=0;i<s.length;i++) { |
241 size_t pos = 0; |
190 if(s.ptr[i] == c) { |
242 if(ucx_strchr(s.ptr, s.length, c, &pos)) { |
191 return sstrsubs(s, i); |
243 return sstrsubs(s, pos); |
192 } |
244 } |
193 } |
245 return sstrn(NULL, 0); |
194 sstr_t n; |
|
195 n.ptr = NULL; |
|
196 n.length = 0; |
|
197 return n; |
|
198 } |
246 } |
199 |
247 |
200 sstr_t sstrrchr(sstr_t s, int c) { |
248 sstr_t sstrrchr(sstr_t s, int c) { |
201 if (s.length > 0) { |
249 size_t pos = 0; |
202 for(size_t i=s.length;i>0;i--) { |
250 if(ucx_strrchr(s.ptr, s.length, c, &pos)) { |
203 if(s.ptr[i-1] == c) { |
251 return sstrsubs(s, pos); |
204 return sstrsubs(s, i-1); |
252 } |
205 } |
253 return sstrn(NULL, 0); |
206 } |
254 } |
207 } |
255 |
208 sstr_t n; |
256 scstr_t scstrchr(scstr_t s, int c) { |
209 n.ptr = NULL; |
257 size_t pos = 0; |
210 n.length = 0; |
258 if(ucx_strchr(s.ptr, s.length, c, &pos)) { |
211 return n; |
259 return scstrsubs(s, pos); |
|
260 } |
|
261 return scstrn(NULL, 0); |
|
262 } |
|
263 |
|
264 scstr_t scstrrchr(scstr_t s, int c) { |
|
265 size_t pos = 0; |
|
266 if(ucx_strrchr(s.ptr, s.length, c, &pos)) { |
|
267 return scstrsubs(s, pos); |
|
268 } |
|
269 return scstrn(NULL, 0); |
212 } |
270 } |
213 |
271 |
214 #define ptable_r(dest, useheap, ptable, index) (dest = useheap ? \ |
272 #define ptable_r(dest, useheap, ptable, index) (dest = useheap ? \ |
215 ((size_t*)ptable)[index] : (size_t) ((uint8_t*)ptable)[index]) |
273 ((size_t*)ptable)[index] : (size_t) ((uint8_t*)ptable)[index]) |
216 |
274 |