static sb_string_t __sb_string_replace__(sb_string_t str, const sb_char_t *pattern, sb_size_t pattern_len, const sb_char_t *to, sb_size_t to_len, sb_int_t max) { sb_string_t str_end = str + sb_string_length(str); sb_string_t dst = sb_string_create(""); sb_char_t *find = str; sb_char_t *last = str; sb_bool_t repeat = max < 0 ? true : false; dst = sb_string_reserve(dst, sb_string_length(str)); for (; repeat ? repeat : max--;) { find = sb_strstr(find, pattern); if (find == nullptr) { goto done; } dst = sb_string_cat_n(dst, last, find - last); dst = sb_string_cat_n(dst, to, to_len); find += pattern_len; last = find; } done: dst = sb_string_cat_n(dst, last, str_end - last); return dst; }
hscriptlet *scriptlet_prepare(scriptlet *s) { scriptlet_share(s); hscriptlet *r = (hscriptlet*)calloc(1, sizeof(struct hscriptlet_)); r->s = s; r->symtab = sb_string_create(); scriptlet_set_int(r, "$FIRST", 1); r->it_syms_save = r->it_syms; return r; }