void example_search() { /* search string via Boyer Moore algorithm */ char *s = "this is a simple example"; char *sub = "mp"; size_t first_idx = strings_search(s, sub, 0); size_t second_idx = strings_search(s, sub, first_idx + 1); printf("'%s' is seen in '%s' at index %zu\n", sub, s, first_idx); printf("'%s' is seen in '%s' again at index %zu\n", sub, s, second_idx); }
void case_strings_search(struct bench_ctx *ctx) { /* suite */ int i; char strs[ctx->n][32]; char subs[ctx->n][4]; for (i = 0; i < ctx->n; i++) { sprintf(strs[i], "%d", i); sprintf(subs[i], "%d", i & 999); } /* bench */ bench_ctx_reset_start_at(ctx); for (i = 0; i < ctx->n; i++) { strings_search(strs[i], subs[i], 0); } bench_ctx_reset_end_at(ctx); }
/* Replace all `sub` in string `src` with `rep` and concat the * result into `dst`. All the arguments are NULL-terminated c * string, return */ char *strings_replace(char *dst, char *src, char *sub, char *rep) { size_t src_len = strlen(src); size_t sub_len = strlen(sub); size_t rep_len = strlen(rep); size_t dst_len = 0; size_t idx, start = 0; while ((idx = strings_search(src, sub, start)) < src_len) { strncat(dst + dst_len, src + start, idx - start); dst_len += idx - start; strcat(dst + dst_len, rep); dst_len += rep_len; start = idx + sub_len; } strcat(dst + dst_len, src + start); dst_len += src_len - start; dst[dst_len] = '\0'; return dst; }