aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorH. Peter Anvin <hpa@zytor.com>2012-02-06 11:08:45 -0800
committerH. Peter Anvin <hpa@zytor.com>2012-02-06 11:08:45 -0800
commit9fe49d0aab0e6366f38d81b8559c308825f9a4e2 (patch)
treeeacfb46015ec9992e17192059786886a6a7d3bc0
parentc0c25b4826950162517896c5039c6d62d07115be (diff)
downloadsyslinux-9fe49d0aab0e6366f38d81b8559c308825f9a4e2.tar.gz
syslinux-9fe49d0aab0e6366f38d81b8559c308825f9a4e2.tar.xz
syslinux-9fe49d0aab0e6366f38d81b8559c308825f9a4e2.zip
strreplace: clean up and simplify
Clean up and simplify strreplace(); in particular there is no need to call strlen() repeatedly on the same strings. Signed-off-by: H. Peter Anvin <hpa@zytor.com>
-rw-r--r--com32/lib/strreplace.c44
1 files changed, 24 insertions, 20 deletions
diff --git a/com32/lib/strreplace.c b/com32/lib/strreplace.c
index 292b11da..bbe6d9eb 100644
--- a/com32/lib/strreplace.c
+++ b/com32/lib/strreplace.c
@@ -29,26 +29,30 @@
#include <string.h>
#include <stdlib.h>
-char *strreplace( const char *string, const char *string_to_replace, const char *string_to_insert ){
- char *token = NULL;
- char *output_buffer = NULL;
-
- token = strstr(string, string_to_replace);
-
- if(token == NULL)
- return strdup( string );
-
- output_buffer = malloc(strlen( string )-strlen( string_to_replace )+strlen(string_to_insert )+ 1);
-
- if(output_buffer == NULL)
+char *strreplace(const char *string, const char *string_to_replace,
+ const char *string_to_insert )
+{
+ char *token = NULL;
+ char *out = NULL;
+
+ size_t slen, srlen, silen;
+
+ token = strstr(string, string_to_replace);
+ if (!token)
+ return strdup(string);
+
+ slen = strlen(string);
+ srlen = strlen(string_to_replace);
+ silen = strlen(string_to_insert);
+
+ out = malloc(slen - srlen + silen + 1);
+ if (!out)
return NULL;
+
+ memcpy(out, string, token - string);
+ memcpy(out + (token - string), string_to_insert, silen);
+ memcpy(out + (token - string) + silen, token + srlen,
+ slen - srlen - (token - string) + 1);
- memcpy(output_buffer, string, token-string);
- memcpy(output_buffer + (token - string), string_to_insert, strlen(string_to_insert));
- memcpy(output_buffer + (token - string) + strlen(string_to_insert),
- token + strlen(string_to_replace),
- strlen(string) - strlen(string_to_replace) - (token - string));
- memset(output_buffer + strlen(string) - strlen(string_to_replace) + strlen(string_to_insert), 0, 1 );
-
- return output_buffer;
+ return out;
}