From cf910b0683de6258e12ddf75788f9beb1abe195a Mon Sep 17 00:00:00 2001 From: Yuri D'Elia Date: Sun, 21 Dec 2014 22:14:19 +0100 Subject: [PATCH] Avoid allocations in string_replace_at when possible. --- utils.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/utils.c b/utils.c index 99135cb..7d07ffe 100644 --- a/utils.c +++ b/utils.c @@ -25,13 +25,21 @@ char *string_replace_at(char *buf, int pos, int len, const char *repl) buf_len = strlen(buf); repl_len = strlen(repl); size = (buf_len - len) + repl_len + 1; - tmp = malloc(size); + + if (repl_len <= len) { + tmp = buf; + } else { + tmp = malloc(size); + } memcpy(tmp, buf, pos); memcpy(tmp + pos, repl, repl_len); - memcpy(tmp + pos + repl_len, buf + pos + len, buf_len - (pos + len) + 1); + memmove(tmp + pos + repl_len, buf + pos + len, buf_len - (pos + len) + 1); + + if(tmp != buf) { + free(buf); + } - free(buf); return tmp; }