29 size_t cache_sz_inc = 16;
32 const size_t cache_sz_inc_factor = 3;
34 const size_t cache_sz_inc_max = 1048576;
36 char *pret, *ret = NULL;
37 const char *pstr2, *pstr = str;
39 ptrdiff_t *pos_cache = NULL;
41 size_t cpylen, orglen, retlen, newlen, oldlen = strlen(old);
44 while ((pstr2 = strstr(pstr, old)) != NULL) {
48 if (cache_sz < count) {
49 cache_sz += cache_sz_inc;
50 pos_cache = realloc(pos_cache,
sizeof(*pos_cache) * cache_sz);
51 if (pos_cache == NULL) {
54 cache_sz_inc *= cache_sz_inc_factor;
55 if (cache_sz_inc > cache_sz_inc_max) {
56 cache_sz_inc = cache_sz_inc_max;
60 pos_cache[count-1] = pstr2 - str;
61 pstr = pstr2 + oldlen;
64 orglen = pstr - str + strlen(pstr);
69 retlen = orglen + (newlen - oldlen) * count;
70 }
else retlen = orglen;
71 ret = malloc(retlen + 1);
83 memcpy(pret, str, pos_cache[0]);
85 for (i = 0; i < count; i++) {
86 memcpy(pret,
new, newlen);
88 pstr = str + pos_cache[i] + oldlen;
89 cpylen = (i == count-1 ? orglen : pos_cache[i+1]) - pos_cache[i] - oldlen;
90 memcpy(pret, pstr, cpylen);