src/string.c

branch
constsstr
changeset 300
d1f814633049
parent 288
6af5798342e8
child 306
90b6d69bb499
equal deleted inserted replaced
288:6af5798342e8 300:d1f814633049
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

mercurial